From: Patrick Palka Date: Wed, 22 Nov 2023 18:54:29 +0000 (-0500) Subject: c++: alias template of non-template class [PR112633] X-Git-Tag: basepoints/gcc-15~4376 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f266c84a15d63e42bfad46397fea9aff92b0720;p=thirdparty%2Fgcc.git c++: alias template of non-template class [PR112633] The entering_scope adjustment in tsubst_aggr_type assumes if an alias is dependent, then so is the aliased type (and therefore it has template info) but that's not true for the dependent alias template specialization ty1 below which aliases the non-template class A. In this case no adjustment is needed anyway, so we can just punt. PR c++/112633 gcc/cp/ChangeLog: * pt.cc (tsubst_aggr_type): Handle empty TYPE_TEMPLATE_INFO in the entering_scope adjustment. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-75.C: New test. --- diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index ed681afb5d43..68ce4a873729 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -13976,6 +13976,7 @@ tsubst_aggr_type (tree t, if (entering_scope && CLASS_TYPE_P (t) && dependent_type_p (t) + && TYPE_TEMPLATE_INFO (t) && TYPE_CANONICAL (t) == TREE_TYPE (TYPE_TI_TEMPLATE (t))) t = TYPE_CANONICAL (t); diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-75.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-75.C new file mode 100644 index 000000000000..1a73a99856e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alias-decl-75.C @@ -0,0 +1,13 @@ +// PR c++/112633 +// { dg-do compile { target c++11 } } + +struct A { using type = void; }; + +template +using ty1 = A; + +template +using ty2 = typename ty1::type; + +template +ty2 f();