From 3f266c84a15d63e42bfad46397fea9aff92b0720 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Wed, 22 Nov 2023 13:54:29 -0500 Subject: [PATCH] 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. --- gcc/cp/pt.cc | 1 + gcc/testsuite/g++.dg/cpp0x/alias-decl-75.C | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/alias-decl-75.C 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(); -- 2.47.2