diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index b63063813f1b5..c5921287a3afb 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -237,8 +237,7 @@ struct TemplateInstantiationArgumentCollecter if (Innermost) AddInnermostTemplateArguments(VTPSD); else if (ForConstraintInstantiation) - AddOuterTemplateArguments(VTPSD, - VTPSD->getInjectedTemplateArgs(S.Context), + AddOuterTemplateArguments(VTPSD, VTPSD->getTemplateArgs().asArray(), /*Final=*/false); if (VTPSD->isMemberSpecialization()) @@ -275,8 +274,7 @@ struct TemplateInstantiationArgumentCollecter if (Innermost) AddInnermostTemplateArguments(CTPSD); else if (ForConstraintInstantiation) - AddOuterTemplateArguments(CTPSD, - CTPSD->getInjectedTemplateArgs(S.Context), + AddOuterTemplateArguments(CTPSD, CTPSD->getTemplateArgs().asArray(), /*Final=*/false); if (CTPSD->isMemberSpecialization()) diff --git a/clang/test/CXX/temp/temp.constr/temp.constr.decl/p4.cpp b/clang/test/CXX/temp/temp.constr/temp.constr.decl/p4.cpp index f144e14cd122f..70064f867e18e 100644 --- a/clang/test/CXX/temp/temp.constr/temp.constr.decl/p4.cpp +++ b/clang/test/CXX/temp/temp.constr/temp.constr.decl/p4.cpp @@ -1,219 +1,175 @@ // RUN: %clang_cc1 -std=c++20 -verify %s // expected-no-diagnostics -namespace Primary { - template - concept D = true; +template +concept D = true; - template - struct A { - template - void f() requires V; - - template<> - void f(); - - template - void g(); - - template requires V - struct B; - - template requires V - struct B; - - template<> - struct B; - - template - struct C; - - template - struct C; - - template requires V - static int x; - - template requires V - static int x; - - template<> - int x; - - template - static int y; - - template - static int y; - }; - - template +template +struct A { template - void A::f() requires V { } + void f() requires V; + + template<> + void f(); - template template - void A::g() { } + void g(); - template template requires V - struct A::B { }; + struct B; - template template requires V - struct A::B { }; + struct B; - template - template requires V - struct A::B { }; + template<> + struct B; - template template - struct A::C { }; + struct C; - template template - struct A::C { }; + struct C; - template template requires V - int A::x = 0; + static int x; - template template requires V - int A::x = 0; + static int x; - template - template requires V - int A::x = 0; + template<> + int x; - template template - int A::y = 0; + static int y; - template template - int A::y = 0; + static int y; +}; - template<> - template - void A::f() requires V; +template +template +void A::f() requires V { } - template<> - template<> - void A::f(); +template +template +void A::g() { } - template<> - template<> - void A::f(); +template +template requires V +struct A::B { }; - template<> - template - void A::g(); +template +template requires V +struct A::B { }; - template<> - template requires V - struct A::B; +template +template requires V +struct A::B { }; - template<> - template<> - struct A::B; +template +template +struct A::C { }; - template<> - template<> - struct A::B; +template +template +struct A::C { }; - template<> - template requires V - struct A::B; +template +template requires V +int A::x = 0; - template<> - template requires V - struct A::B; +template +template requires V +int A::x = 0; - template<> - template - struct A::C; +template +template requires V +int A::x = 0; - template<> - template - struct A::C; +template +template +int A::y = 0; - template<> - template - struct A::C; +template +template +int A::y = 0; - template<> - template requires V - int A::x; +template<> +template +void A::f() requires V; - template<> - template<> - int A::x; +template<> +template<> +void A::f(); - template<> - template<> - int A::x; +template<> +template<> +void A::f(); - template<> - template requires V - int A::x; +template<> +template +void A::g(); - template<> - template requires V - int A::x; +template<> +template requires V +struct A::B; - template<> - template - int A::y; +template<> +template<> +struct A::B; - template<> - template - int A::y; +template<> +template<> +struct A::B; - template<> - template - int A::y; -} // namespace Primary +template<> +template requires V +struct A::B; -namespace Partial { - template - struct A; +template<> +template requires V +struct A::B; - template - struct A - { - template requires U - void f(); +template<> +template +struct A::C; - template requires U - static const int x; +template<> +template +struct A::C; - template requires U - struct B; - }; +template<> +template +struct A::C; - template - template requires U - void A::f() { } +template<> +template requires V +int A::x; - template - template requires U - constexpr int A::x = 0; +template<> +template<> +int A::x; - template - template requires U - struct A::B { }; +template<> +template<> +int A::x; - template<> - template requires true - void A::f() { } +template<> +template requires V +int A::x; - template<> - template requires true - constexpr int A::x = 1; +template<> +template requires V +int A::x; - template<> - template requires true - struct A::B { }; -} // namespace Partial +template<> +template +int A::y; + +template<> +template +int A::y; + +template<> +template +int A::y;