On 8/7/26 7:01 AM, Jakub Jelinek wrote:
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?
OK.
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