From 5a1717fbdfd1242a5beb3ac8300766a3534d3f88 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 22 Mar 2023 11:12:57 -0400 Subject: [PATCH] c++: array bound partial ordering [PR108390] fold_convert doesn't work with a dependent argument, and problematically differed from the corresponding fold+build_nop further down in the function. So change it to match. PR c++/108390 gcc/cp/ChangeLog: * pt.cc (unify): Use fold of build_nop instead of fold_convert. gcc/testsuite/ChangeLog: * g++.dg/template/partial-order3.C: New test. --- gcc/cp/pt.cc | 8 +++++--- gcc/testsuite/g++.dg/template/partial-order3.C | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/partial-order3.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 056b8c7..90bcaa7 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -24635,8 +24635,9 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, if ((strict & UNIFY_ALLOW_INTEGER) && TREE_TYPE (targ) && TREE_TYPE (arg) && CP_INTEGRAL_TYPE_P (TREE_TYPE (targ))) - /* We're deducing from an array bound, the type doesn't matter. */ - arg = fold_convert (TREE_TYPE (targ), arg); + /* We're deducing from an array bound, the type doesn't matter. + This conversion should match the one below. */ + arg = fold (build_nop (TREE_TYPE (targ), arg)); int x = !cp_tree_equal (targ, arg); if (x) unify_inconsistency (explain_p, parm, targ, arg); @@ -24684,7 +24685,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, && CP_INTEGRAL_TYPE_P (tparm)) /* Convert the ARG to the type of PARM; the deduced non-type template argument must exactly match the types of the - corresponding parameter. */ + corresponding parameter. This conversion should match the + one above. */ arg = fold (build_nop (tparm, arg)); else if (uses_template_parms (tparm)) { diff --git a/gcc/testsuite/g++.dg/template/partial-order3.C b/gcc/testsuite/g++.dg/template/partial-order3.C new file mode 100644 index 0000000..1545053 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial-order3.C @@ -0,0 +1,6 @@ +// PR c++/108390 +// { dg-do compile { target c++11 } } + +template long f(int(*)[t], T(*)[t]); +template int f(int(*)[i], T(*)[i]) = delete; +int n = f(0, 0); -- 2.7.4