[PATCH] c++: Fix up unify_array_domain [PR125536]

Jakub Jelinek <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <anW69zOstwsCKvLw@tucnak>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.