Hi!

The following testcase is incorrectly rejected on lp64 targets.
The bug is that unify_array_domain uses forcefully
integer_type_node/integer_one_node to add 1 to parm_max or arg_max,
regardless of the type it has.  From playing with testcases,
at least arg_max seems to be pretty much always sizetype/size_t.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2026-08-07  Jakub Jelinek  <[email protected]>

        PR c++/125536
        * pt.cc (unify_array_domain): When adding 1 to parm_max or
        arg_max, perform the addition in the type of those trees
        rather than unconditionally in int type.

        * g++.dg/template/unify14.C: New test.

--- gcc/cp/pt.cc.jj     2026-08-07 09:03:30.491074347 +0200
+++ gcc/cp/pt.cc        2026-08-07 10:27:02.756915023 +0200
@@ -26284,14 +26284,14 @@ unify_array_domain (tree tparms, tree ta
      by adding one to the other bound.  */
   if (parm_cst && !arg_cst)
     parm_max = fold_build2_loc (input_location, PLUS_EXPR,
-                               integer_type_node,
+                               TREE_TYPE (parm_max),
                                parm_max,
-                               integer_one_node);
+                               build_int_cst (TREE_TYPE (parm_max), 1));
   else if (arg_cst && !parm_cst)
     arg_max = fold_build2_loc (input_location, PLUS_EXPR,
-                              integer_type_node,
+                              TREE_TYPE (arg_max),
                               arg_max,
-                              integer_one_node);
+                              build_int_cst (TREE_TYPE (arg_max), 1));
 
   return unify (tparms, targs, parm_max, arg_max,
                UNIFY_ALLOW_INTEGER, explain_p);
--- gcc/testsuite/g++.dg/template/unify14.C.jj  2026-08-07 12:35:37.996903619 
+0200
+++ gcc/testsuite/g++.dg/template/unify14.C     2026-08-07 12:56:23.762012258 
+0200
@@ -0,0 +1,15 @@
+// PR c++/125536
+// { dg-do compile { target c++14 } }
+
+template <typename>
+constexpr bool x = false;
+
+template <unsigned long long N>
+constexpr bool x <char [N]> = true;
+
+#if __PTRDIFF_MAX__ >= 2147483647
+static_assert (x <char [2147483647]>, "");
+#endif
+#if __PTRDIFF_MAX__ > 2147483647
+static_assert (x <char [2147483648U]>, "");
+#endif

        Jakub

Reply via email to