Skip to content

Commit 2904f80

Browse files
authored
Revert "[Clang][Sema] Use the correct injected template arguments for partial specializations when collecting multi-level template argument lists (#112381)" (#115157)
This reverts commit 9381c6f.
1 parent 79f4d8f commit 2904f80

File tree

2 files changed

+122
-168
lines changed

2 files changed

+122
-168
lines changed

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,7 @@ struct TemplateInstantiationArgumentCollecter
237237
if (Innermost)
238238
AddInnermostTemplateArguments(VTPSD);
239239
else if (ForConstraintInstantiation)
240-
AddOuterTemplateArguments(VTPSD,
241-
VTPSD->getInjectedTemplateArgs(S.Context),
240+
AddOuterTemplateArguments(VTPSD, VTPSD->getTemplateArgs().asArray(),
242241
/*Final=*/false);
243242

244243
if (VTPSD->isMemberSpecialization())
@@ -275,8 +274,7 @@ struct TemplateInstantiationArgumentCollecter
275274
if (Innermost)
276275
AddInnermostTemplateArguments(CTPSD);
277276
else if (ForConstraintInstantiation)
278-
AddOuterTemplateArguments(CTPSD,
279-
CTPSD->getInjectedTemplateArgs(S.Context),
277+
AddOuterTemplateArguments(CTPSD, CTPSD->getTemplateArgs().asArray(),
280278
/*Final=*/false);
281279

282280
if (CTPSD->isMemberSpecialization())
Lines changed: 120 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -1,219 +1,175 @@
11
// RUN: %clang_cc1 -std=c++20 -verify %s
22
// expected-no-diagnostics
33

4-
namespace Primary {
5-
template<typename T>
6-
concept D = true;
4+
template<typename T>
5+
concept D = true;
76

8-
template<typename T>
9-
struct A {
10-
template<typename U, bool V>
11-
void f() requires V;
12-
13-
template<>
14-
void f<short, true>();
15-
16-
template<D U>
17-
void g();
18-
19-
template<typename U, bool V> requires V
20-
struct B;
21-
22-
template<typename U, bool V> requires V
23-
struct B<U*, V>;
24-
25-
template<>
26-
struct B<short, true>;
27-
28-
template<D U>
29-
struct C;
30-
31-
template<D U>
32-
struct C<U*>;
33-
34-
template<typename U, bool V> requires V
35-
static int x;
36-
37-
template<typename U, bool V> requires V
38-
static int x<U*, V>;
39-
40-
template<>
41-
int x<short, true>;
42-
43-
template<D U>
44-
static int y;
45-
46-
template<D U>
47-
static int y<U*>;
48-
};
49-
50-
template<typename T>
7+
template<typename T>
8+
struct A {
519
template<typename U, bool V>
52-
void A<T>::f() requires V { }
10+
void f() requires V;
11+
12+
template<>
13+
void f<short, true>();
5314

54-
template<typename T>
5515
template<D U>
56-
void A<T>::g() { }
16+
void g();
5717

58-
template<typename T>
5918
template<typename U, bool V> requires V
60-
struct A<T>::B { };
19+
struct B;
6120

62-
template<typename T>
6321
template<typename U, bool V> requires V
64-
struct A<T>::B<U*, V> { };
22+
struct B<U*, V>;
6523

66-
template<typename T>
67-
template<typename U, bool V> requires V
68-
struct A<T>::B<U&, V> { };
24+
template<>
25+
struct B<short, true>;
6926

70-
template<typename T>
7127
template<D U>
72-
struct A<T>::C { };
28+
struct C;
7329

74-
template<typename T>
7530
template<D U>
76-
struct A<T>::C<U*> { };
31+
struct C<U*>;
7732

78-
template<typename T>
7933
template<typename U, bool V> requires V
80-
int A<T>::x = 0;
34+
static int x;
8135

82-
template<typename T>
8336
template<typename U, bool V> requires V
84-
int A<T>::x<U*, V> = 0;
37+
static int x<U*, V>;
8538

86-
template<typename T>
87-
template<typename U, bool V> requires V
88-
int A<T>::x<U&, V> = 0;
39+
template<>
40+
int x<short, true>;
8941

90-
template<typename T>
9142
template<D U>
92-
int A<T>::y = 0;
43+
static int y;
9344

94-
template<typename T>
9545
template<D U>
96-
int A<T>::y<U*> = 0;
46+
static int y<U*>;
47+
};
9748

98-
template<>
99-
template<typename U, bool V>
100-
void A<short>::f() requires V;
49+
template<typename T>
50+
template<typename U, bool V>
51+
void A<T>::f() requires V { }
10152

102-
template<>
103-
template<>
104-
void A<short>::f<int, true>();
53+
template<typename T>
54+
template<D U>
55+
void A<T>::g() { }
10556

106-
template<>
107-
template<>
108-
void A<void>::f<int, true>();
57+
template<typename T>
58+
template<typename U, bool V> requires V
59+
struct A<T>::B { };
10960

110-
template<>
111-
template<D U>
112-
void A<short>::g();
61+
template<typename T>
62+
template<typename U, bool V> requires V
63+
struct A<T>::B<U*, V> { };
11364

114-
template<>
115-
template<typename U, bool V> requires V
116-
struct A<int>::B;
65+
template<typename T>
66+
template<typename U, bool V> requires V
67+
struct A<T>::B<U&, V> { };
11768

118-
template<>
119-
template<>
120-
struct A<int>::B<int, true>;
69+
template<typename T>
70+
template<D U>
71+
struct A<T>::C { };
12172

122-
template<>
123-
template<>
124-
struct A<void>::B<int, true>;
73+
template<typename T>
74+
template<D U>
75+
struct A<T>::C<U*> { };
12576

126-
template<>
127-
template<typename U, bool V> requires V
128-
struct A<int>::B<U*, V>;
77+
template<typename T>
78+
template<typename U, bool V> requires V
79+
int A<T>::x = 0;
12980

130-
template<>
131-
template<typename U, bool V> requires V
132-
struct A<int>::B<U&, V>;
81+
template<typename T>
82+
template<typename U, bool V> requires V
83+
int A<T>::x<U*, V> = 0;
13384

134-
template<>
135-
template<D U>
136-
struct A<int>::C;
85+
template<typename T>
86+
template<typename U, bool V> requires V
87+
int A<T>::x<U&, V> = 0;
13788

138-
template<>
139-
template<D U>
140-
struct A<int>::C<U*>;
89+
template<typename T>
90+
template<D U>
91+
int A<T>::y = 0;
14192

142-
template<>
143-
template<D U>
144-
struct A<int>::C<U&>;
93+
template<typename T>
94+
template<D U>
95+
int A<T>::y<U*> = 0;
14596

146-
template<>
147-
template<typename U, bool V> requires V
148-
int A<long>::x;
97+
template<>
98+
template<typename U, bool V>
99+
void A<short>::f() requires V;
149100

150-
template<>
151-
template<>
152-
int A<long>::x<int, true>;
101+
template<>
102+
template<>
103+
void A<short>::f<int, true>();
153104

154-
template<>
155-
template<>
156-
int A<void>::x<int, true>;
105+
template<>
106+
template<>
107+
void A<void>::f<int, true>();
157108

158-
template<>
159-
template<typename U, bool V> requires V
160-
int A<long>::x<U*, V>;
109+
template<>
110+
template<D U>
111+
void A<short>::g();
161112

162-
template<>
163-
template<typename U, bool V> requires V
164-
int A<long>::x<U&, V>;
113+
template<>
114+
template<typename U, bool V> requires V
115+
struct A<int>::B;
165116

166-
template<>
167-
template<D U>
168-
int A<long>::y;
117+
template<>
118+
template<>
119+
struct A<int>::B<int, true>;
169120

170-
template<>
171-
template<D U>
172-
int A<long>::y<U*>;
121+
template<>
122+
template<>
123+
struct A<void>::B<int, true>;
173124

174-
template<>
175-
template<D U>
176-
int A<long>::y<U&>;
177-
} // namespace Primary
125+
template<>
126+
template<typename U, bool V> requires V
127+
struct A<int>::B<U*, V>;
178128

179-
namespace Partial {
180-
template<typename T, bool B>
181-
struct A;
129+
template<>
130+
template<typename U, bool V> requires V
131+
struct A<int>::B<U&, V>;
182132

183-
template<bool U>
184-
struct A<int, U>
185-
{
186-
template<typename V> requires U
187-
void f();
133+
template<>
134+
template<D U>
135+
struct A<int>::C;
188136

189-
template<typename V> requires U
190-
static const int x;
137+
template<>
138+
template<D U>
139+
struct A<int>::C<U*>;
191140

192-
template<typename V> requires U
193-
struct B;
194-
};
141+
template<>
142+
template<D U>
143+
struct A<int>::C<U&>;
195144

196-
template<bool U>
197-
template<typename V> requires U
198-
void A<int, U>::f() { }
145+
template<>
146+
template<typename U, bool V> requires V
147+
int A<long>::x;
199148

200-
template<bool U>
201-
template<typename V> requires U
202-
constexpr int A<int, U>::x = 0;
149+
template<>
150+
template<>
151+
int A<long>::x<int, true>;
203152

204-
template<bool U>
205-
template<typename V> requires U
206-
struct A<int, U>::B { };
153+
template<>
154+
template<>
155+
int A<void>::x<int, true>;
207156

208-
template<>
209-
template<typename V> requires true
210-
void A<int, true>::f() { }
157+
template<>
158+
template<typename U, bool V> requires V
159+
int A<long>::x<U*, V>;
211160

212-
template<>
213-
template<typename V> requires true
214-
constexpr int A<int, true>::x = 1;
161+
template<>
162+
template<typename U, bool V> requires V
163+
int A<long>::x<U&, V>;
215164

216-
template<>
217-
template<typename V> requires true
218-
struct A<int, true>::B { };
219-
} // namespace Partial
165+
template<>
166+
template<D U>
167+
int A<long>::y;
168+
169+
template<>
170+
template<D U>
171+
int A<long>::y<U*>;
172+
173+
template<>
174+
template<D U>
175+
int A<long>::y<U&>;

0 commit comments

Comments
 (0)