[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