@@ -49,27 +49,19 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
49
49
// / \param CheckConformance Will be set true if the caller needs to call
50
50
// / checkExplicitConformance() for this declaration once its members have
51
51
// / been type-checked. Otherwise, the conformance check can be delayed.
52
- void checkInherited (Decl *D, Type T, MutableArrayRef<Type> Inherited,
53
- bool &CheckConformance) {
52
+ void checkInherited (Decl *D, Type T, MutableArrayRef<Type> Inherited) {
54
53
// Check the list of inherited protocols.
55
- bool ConformsToProtocols = false ;
56
54
for (unsigned i = 0 , e = Inherited.size (); i != e; ++i) {
57
55
if (TC.validateType (Inherited[i], IsFirstPass)) {
58
56
Inherited[i] = ErrorType::get (TC.Context );
59
57
continue ;
60
58
}
61
59
62
- if (!Inherited[i]->is <ProtocolType>()) {
60
+ if (!Inherited[i]->is <ProtocolType>() && !Inherited[i]-> is <ErrorType>() ) {
63
61
// FIXME: Terrible location information.
64
62
TC.diagnose (D->getLocStart (), diag::nonprotocol_inherit, Inherited[i]);
65
- } else if (!Inherited[i]->is <ErrorType>()) {
66
- ConformsToProtocols = true ;
67
63
}
68
64
}
69
-
70
- CheckConformance = ConformsToProtocols &&
71
- !D->getDeclContext ()->isModuleContext () &&
72
- !isa<ProtocolDecl>(D);
73
65
}
74
66
75
67
void checkExplicitConformance (Decl *D, Type T,
@@ -187,28 +179,36 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
187
179
}
188
180
189
181
void visitOneOfDecl (OneOfDecl *OOD) {
190
- if (IsSecondPass)
182
+ if (IsSecondPass) {
183
+ for (auto elt : OOD->getElements ())
184
+ visitOneOfElementDecl (elt);
185
+
186
+ checkExplicitConformance (OOD, OOD->getDeclaredType (),
187
+ OOD->getInherited ());
191
188
return ;
189
+ }
192
190
193
- bool CheckConformance;
194
- checkInherited (OOD, OOD->getDeclaredType (), OOD->getInherited (),
195
- CheckConformance);
191
+ checkInherited (OOD, OOD->getDeclaredType (), OOD->getInherited ());
196
192
197
193
for (auto elt : OOD->getElements ())
198
194
visitOneOfElementDecl (elt);
199
195
200
- if (CheckConformance )
196
+ if (!IsFirstPass )
201
197
checkExplicitConformance (OOD, OOD->getDeclaredType (),
202
198
OOD->getInherited ());
203
199
}
204
200
205
201
void visitStructDecl (StructDecl *SD) {
206
- if (IsSecondPass)
202
+ if (IsSecondPass) {
203
+ for (Decl *Member : SD->getMembers ())
204
+ visit (Member);
205
+
206
+ checkExplicitConformance (SD, SD->getDeclaredType (),
207
+ SD->getInherited ());
207
208
return ;
209
+ }
208
210
209
- bool CheckConformance;
210
- checkInherited (SD, SD->getDeclaredType (), SD->getInherited (),
211
- CheckConformance);
211
+ checkInherited (SD, SD->getDeclaredType (), SD->getInherited ());
212
212
213
213
for (Decl *Member : SD->getMembers ()) {
214
214
visit (Member);
@@ -226,24 +226,28 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
226
226
cast<OneOfElementDecl>(SD->getMembers ().back ())->setType (CreateTy);
227
227
cast<OneOfElementDecl>(SD->getMembers ().back ())->setArgumentType (TT);
228
228
229
- if (CheckConformance )
229
+ if (!IsFirstPass )
230
230
checkExplicitConformance (SD, SD->getDeclaredType (),
231
231
SD->getInherited ());
232
232
}
233
233
234
234
void visitClassDecl (ClassDecl *CD) {
235
- if (IsSecondPass)
235
+ if (IsSecondPass) {
236
+ for (Decl *Member : CD->getMembers ())
237
+ visit (Member);
238
+
239
+ checkExplicitConformance (CD, CD->getDeclaredType (),
240
+ CD->getInherited ());
236
241
return ;
242
+ }
237
243
238
- bool CheckConformance;
239
- checkInherited (CD, CD->getDeclaredType (), CD->getInherited (),
240
- CheckConformance);
244
+ checkInherited (CD, CD->getDeclaredType (), CD->getInherited ());
241
245
242
246
for (Decl *Member : CD->getMembers ()) {
243
247
visit (Member);
244
248
}
245
249
246
- if (CheckConformance )
250
+ if (!IsFirstPass )
247
251
checkExplicitConformance (CD, CD->getDeclaredType (),
248
252
CD->getInherited ());
249
253
}
@@ -252,9 +256,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
252
256
if (IsSecondPass)
253
257
return ;
254
258
255
- bool CheckConformance;
256
- checkInherited (PD, PD->getDeclaredType (), PD->getInherited (),
257
- CheckConformance);
259
+ checkInherited (PD, PD->getDeclaredType (), PD->getInherited ());
258
260
259
261
// Assign archetypes each of the associated types.
260
262
// FIXME: We need to build equivalence classes of associated types first,
@@ -297,6 +299,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
297
299
298
300
visitValueDecl (FD);
299
301
}
302
+
300
303
void visitOneOfElementDecl (OneOfElementDecl *ED) {
301
304
if (IsSecondPass)
302
305
return ;
@@ -313,11 +316,19 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
313
316
diag::oneof_element_not_materializable);
314
317
}
315
318
}
319
+
316
320
void visitExtensionDecl (ExtensionDecl *ED) {
317
- if (IsSecondPass)
321
+ if (IsSecondPass) {
322
+ for (Decl *Member : ED->getMembers ())
323
+ // First recursively type check each thing in the extension.
324
+ visit (Member);
325
+
326
+ checkExplicitConformance (ED, ED->getExtendedType (),
327
+ ED->getInherited ());
318
328
return ;
329
+ }
330
+
319
331
320
- bool CheckConformance;
321
332
if (TC.validateType (ED->getExtendedType (), IsFirstPass)) {
322
333
ED->setExtendedType (ErrorType::get (TC.Context ));
323
334
} else {
@@ -330,13 +341,17 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
330
341
// declaration, if any.
331
342
}
332
343
333
- checkInherited (ED, ExtendedTy, ED->getInherited (), CheckConformance );
344
+ checkInherited (ED, ExtendedTy, ED->getInherited ());
334
345
}
335
346
336
347
for (Decl *Member : ED->getMembers ()) {
337
348
// First recursively type check each thing in the extension.
338
349
visit (Member);
339
350
}
351
+
352
+ if (!IsFirstPass)
353
+ checkExplicitConformance (ED, ED->getExtendedType (),
354
+ ED->getInherited ());
340
355
}
341
356
342
357
void visitTopLevelCodeDecl (TopLevelCodeDecl *TLCD) {
0 commit comments