[clang] Revert "[Clang][Sema] Use the correct injected template arguments for partial specializations when collecting multi-level template argument lists (#112381)" (PR #115157)
Krystian Stasiowski via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 6 05:41:06 PST 2024
https://github.com/sdkrystian updated https://github.com/llvm/llvm-project/pull/115157
>From d36ee37cdba49332d36ab8204826e50614359e82 Mon Sep 17 00:00:00 2001
From: Krystian Stasiowski <sdkrystian at gmail.com>
Date: Wed, 6 Nov 2024 08:36:04 -0500
Subject: [PATCH] Revert "[Clang][Sema] Use the correct injected template
arguments for partial specializations when collecting multi-level template
argument lists (#112381)"
This reverts commit 9381c6fd04cc16a7606633f57c96c11e58181ddb.
---
clang/lib/Sema/SemaTemplateInstantiate.cpp | 6 +-
.../temp/temp.constr/temp.constr.decl/p4.cpp | 284 ++++++++----------
2 files changed, 122 insertions(+), 168 deletions(-)
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index b63063813f1b56..c5921287a3afb2 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 f144e14cd122f9..70064f867e18e3 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<typename T>
- concept D = true;
+template<typename T>
+concept D = true;
- template<typename T>
- struct A {
- template<typename U, bool V>
- void f() requires V;
-
- template<>
- void f<short, true>();
-
- template<D U>
- void g();
-
- template<typename U, bool V> requires V
- struct B;
-
- template<typename U, bool V> requires V
- struct B<U*, V>;
-
- template<>
- struct B<short, true>;
-
- template<D U>
- struct C;
-
- template<D U>
- struct C<U*>;
-
- template<typename U, bool V> requires V
- static int x;
-
- template<typename U, bool V> requires V
- static int x<U*, V>;
-
- template<>
- int x<short, true>;
-
- template<D U>
- static int y;
-
- template<D U>
- static int y<U*>;
- };
-
- template<typename T>
+template<typename T>
+struct A {
template<typename U, bool V>
- void A<T>::f() requires V { }
+ void f() requires V;
+
+ template<>
+ void f<short, true>();
- template<typename T>
template<D U>
- void A<T>::g() { }
+ void g();
- template<typename T>
template<typename U, bool V> requires V
- struct A<T>::B { };
+ struct B;
- template<typename T>
template<typename U, bool V> requires V
- struct A<T>::B<U*, V> { };
+ struct B<U*, V>;
- template<typename T>
- template<typename U, bool V> requires V
- struct A<T>::B<U&, V> { };
+ template<>
+ struct B<short, true>;
- template<typename T>
template<D U>
- struct A<T>::C { };
+ struct C;
- template<typename T>
template<D U>
- struct A<T>::C<U*> { };
+ struct C<U*>;
- template<typename T>
template<typename U, bool V> requires V
- int A<T>::x = 0;
+ static int x;
- template<typename T>
template<typename U, bool V> requires V
- int A<T>::x<U*, V> = 0;
+ static int x<U*, V>;
- template<typename T>
- template<typename U, bool V> requires V
- int A<T>::x<U&, V> = 0;
+ template<>
+ int x<short, true>;
- template<typename T>
template<D U>
- int A<T>::y = 0;
+ static int y;
- template<typename T>
template<D U>
- int A<T>::y<U*> = 0;
+ static int y<U*>;
+};
- template<>
- template<typename U, bool V>
- void A<short>::f() requires V;
+template<typename T>
+template<typename U, bool V>
+void A<T>::f() requires V { }
- template<>
- template<>
- void A<short>::f<int, true>();
+template<typename T>
+template<D U>
+void A<T>::g() { }
- template<>
- template<>
- void A<void>::f<int, true>();
+template<typename T>
+template<typename U, bool V> requires V
+struct A<T>::B { };
- template<>
- template<D U>
- void A<short>::g();
+template<typename T>
+template<typename U, bool V> requires V
+struct A<T>::B<U*, V> { };
- template<>
- template<typename U, bool V> requires V
- struct A<int>::B;
+template<typename T>
+template<typename U, bool V> requires V
+struct A<T>::B<U&, V> { };
- template<>
- template<>
- struct A<int>::B<int, true>;
+template<typename T>
+template<D U>
+struct A<T>::C { };
- template<>
- template<>
- struct A<void>::B<int, true>;
+template<typename T>
+template<D U>
+struct A<T>::C<U*> { };
- template<>
- template<typename U, bool V> requires V
- struct A<int>::B<U*, V>;
+template<typename T>
+template<typename U, bool V> requires V
+int A<T>::x = 0;
- template<>
- template<typename U, bool V> requires V
- struct A<int>::B<U&, V>;
+template<typename T>
+template<typename U, bool V> requires V
+int A<T>::x<U*, V> = 0;
- template<>
- template<D U>
- struct A<int>::C;
+template<typename T>
+template<typename U, bool V> requires V
+int A<T>::x<U&, V> = 0;
- template<>
- template<D U>
- struct A<int>::C<U*>;
+template<typename T>
+template<D U>
+int A<T>::y = 0;
- template<>
- template<D U>
- struct A<int>::C<U&>;
+template<typename T>
+template<D U>
+int A<T>::y<U*> = 0;
- template<>
- template<typename U, bool V> requires V
- int A<long>::x;
+template<>
+template<typename U, bool V>
+void A<short>::f() requires V;
- template<>
- template<>
- int A<long>::x<int, true>;
+template<>
+template<>
+void A<short>::f<int, true>();
- template<>
- template<>
- int A<void>::x<int, true>;
+template<>
+template<>
+void A<void>::f<int, true>();
- template<>
- template<typename U, bool V> requires V
- int A<long>::x<U*, V>;
+template<>
+template<D U>
+void A<short>::g();
- template<>
- template<typename U, bool V> requires V
- int A<long>::x<U&, V>;
+template<>
+template<typename U, bool V> requires V
+struct A<int>::B;
- template<>
- template<D U>
- int A<long>::y;
+template<>
+template<>
+struct A<int>::B<int, true>;
- template<>
- template<D U>
- int A<long>::y<U*>;
+template<>
+template<>
+struct A<void>::B<int, true>;
- template<>
- template<D U>
- int A<long>::y<U&>;
-} // namespace Primary
+template<>
+template<typename U, bool V> requires V
+struct A<int>::B<U*, V>;
-namespace Partial {
- template<typename T, bool B>
- struct A;
+template<>
+template<typename U, bool V> requires V
+struct A<int>::B<U&, V>;
- template<bool U>
- struct A<int, U>
- {
- template<typename V> requires U
- void f();
+template<>
+template<D U>
+struct A<int>::C;
- template<typename V> requires U
- static const int x;
+template<>
+template<D U>
+struct A<int>::C<U*>;
- template<typename V> requires U
- struct B;
- };
+template<>
+template<D U>
+struct A<int>::C<U&>;
- template<bool U>
- template<typename V> requires U
- void A<int, U>::f() { }
+template<>
+template<typename U, bool V> requires V
+int A<long>::x;
- template<bool U>
- template<typename V> requires U
- constexpr int A<int, U>::x = 0;
+template<>
+template<>
+int A<long>::x<int, true>;
- template<bool U>
- template<typename V> requires U
- struct A<int, U>::B { };
+template<>
+template<>
+int A<void>::x<int, true>;
- template<>
- template<typename V> requires true
- void A<int, true>::f() { }
+template<>
+template<typename U, bool V> requires V
+int A<long>::x<U*, V>;
- template<>
- template<typename V> requires true
- constexpr int A<int, true>::x = 1;
+template<>
+template<typename U, bool V> requires V
+int A<long>::x<U&, V>;
- template<>
- template<typename V> requires true
- struct A<int, true>::B { };
-} // namespace Partial
+template<>
+template<D U>
+int A<long>::y;
+
+template<>
+template<D U>
+int A<long>::y<U*>;
+
+template<>
+template<D U>
+int A<long>::y<U&>;
More information about the cfe-commits
mailing list