diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1d14ead778446..87550614f645b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -5539,21 +5539,10 @@ QualType TreeTransform::TransformTypeInObjectScope( TLB, TL.castAs(), /*DeducedTSTContext=*/false, ObjectType, UnqualLookup); } - case TypeLoc::Typedef: - case TypeLoc::TemplateSpecialization: - case TypeLoc::SubstTemplateTypeParm: - case TypeLoc::SubstTemplateTypeParmPack: - case TypeLoc::PackIndexing: - case TypeLoc::Enum: - case TypeLoc::Record: - case TypeLoc::InjectedClassName: - case TypeLoc::TemplateTypeParm: - case TypeLoc::Decltype: - case TypeLoc::UnresolvedUsing: - case TypeLoc::Using: - return getDerived().TransformType(TLB, TL); default: - llvm_unreachable("unexpected type class"); + // Any dependent canonical type can appear here, through type alias + // templates. + return getDerived().TransformType(TLB, TL); } } diff --git a/clang/test/SemaTemplate/nested-name-spec-template.cpp b/clang/test/SemaTemplate/nested-name-spec-template.cpp index 153f4e2555e3a..0f51a14af9e52 100644 --- a/clang/test/SemaTemplate/nested-name-spec-template.cpp +++ b/clang/test/SemaTemplate/nested-name-spec-template.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -Wno-c++20-extensions -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions -std=c++98 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s namespace N { @@ -24,14 +24,7 @@ namespace N { M::Promote::type *ret_intptr3(int* ip) { return ip; } M::template Promote::type *ret_intptr4(int* ip) { return ip; } -#if __cplusplus <= 199711L - // expected-warning@-2 {{'template' keyword outside of a template}} -#endif - M::template Promote pi; -#if __cplusplus <= 199711L - // expected-warning@-2 {{'template' keyword outside of a template}} -#endif } N::M::Promote::type *ret_intptr5(int* ip) { return ip; } @@ -181,3 +174,15 @@ namespace SubstTemplateTypeParmPackType { template void f(); } // namespace SubstTemplateTypeParmPackType #endif + +namespace DependentUnaryTransform { + template using decay_t = __decay(T); + template struct A; + template struct A::X>; +} // namespace DependentUnaryTransform + +namespace DependentSizedArray { + template using Z = int[V]; + template struct A; + template struct A::X>; +} // namespace DependentUnaryTransform