From a11f204e5a30d1dfd2508e3f3014509a0342f604 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 1 Apr 2022 15:55:21 -0400 Subject: [PATCH] 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. --- gcc/cp/pt.cc | 13 +++++++++++++ gcc/testsuite/g++.dg/cpp0x/alias-decl-dr1286a.C | 16 ++++++++-------- gcc/testsuite/g++.dg/cpp1z/class-deduction-alias1.C | 17 +++++++++++++++++ 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction-alias1.C diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 75ed9a3..1f0231f 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 1780c9a..fbd63d8 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