From: Jason Merrill Date: Fri, 1 Apr 2022 19:55:21 +0000 (-0400) Subject: c++: alias-tmpl equivalence and default targs [PR103852] X-Git-Tag: basepoints/gcc-13~329 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a11f204e5a30d1dfd2508e3f3014509a0342f604;p=thirdparty%2Fgcc.git c++: alias-tmpl equivalence and default targs [PR103852] The suggested resolution for CWG1286, which we implemented, ignores default template arguments, but this PR is an example of why that doesn't make sense: the templates aren't functionally equivalent. PR c++/103852 DR 1286 gcc/cp/ChangeLog: * pt.cc (get_underlying_template): Compare default template args. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-dr1286a.C: Default args now matter. * g++.dg/cpp1z/class-deduction-alias1.C: New test. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 75ed9a34018a..1f0231f70e67 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -6637,6 +6637,18 @@ get_underlying_template (tree tmpl) if (!comp_template_args (TI_ARGS (tinfo), alias_args)) break; + /* Are any default template arguments equivalent? */ + tree aparms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (tmpl)); + tree uparms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (underlying)); + const int nparms = TREE_VEC_LENGTH (aparms); + for (int i = 0; i < nparms; ++i) + { + tree adefarg = TREE_PURPOSE (TREE_VEC_ELT (aparms, i)); + tree udefarg = TREE_PURPOSE (TREE_VEC_ELT (uparms, i)); + if (!template_args_equal (adefarg, udefarg)) + goto top_break; + } + /* If TMPL adds or changes any constraints, it isn't equivalent. I think it's appropriate to treat a less-constrained alias as equivalent. */ if (!at_least_as_constrained (underlying, tmpl)) @@ -6645,6 +6657,7 @@ get_underlying_template (tree tmpl) /* Alias is equivalent. Strip it and repeat. */ tmpl = underlying; } + top_break:; return tmpl; } diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C index 1780c9a47b79..fbd63d891d01 100644 --- a/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C @@ -11,13 +11,13 @@ template struct A; template