Skip to content

Commit b7c1386

Browse files
committed
Sema: DeclChecker::visitProtocolDecl() does everything in the 'first pass'
Since protocol members no longer get visited in the 'second pass', change functions, constructors, associated types and pattern bindings to check accessibility in the first pass.
1 parent 63db382 commit b7c1386

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4260,10 +4260,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42604260
});
42614261
}
42624262

4263-
if (!IsFirstPass)
4264-
checkAccessControl(TC, PBD);
4265-
42664263
TC.checkDeclAttributes(PBD);
4264+
4265+
if (IsFirstPass)
4266+
checkAccessControl(TC, PBD);
42674267
}
42684268

42694269
void visitSubscriptDecl(SubscriptDecl *SD) {
@@ -4289,17 +4289,22 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42894289
checkAccessControl(TC, TAD);
42904290
}
42914291

4292-
void visitAssociatedTypeDecl(AssociatedTypeDecl *assocType) {
4293-
if (!assocType->hasValidationStarted())
4294-
TC.validateDecl(assocType);
4292+
void visitAssociatedTypeDecl(AssociatedTypeDecl *AT) {
4293+
if (!IsFirstPass) {
4294+
return;
4295+
}
4296+
4297+
TC.validateDecl(AT);
42954298

4296-
auto *proto = assocType->getProtocol();
4299+
auto *proto = AT->getProtocol();
42974300
if (proto->isObjC()) {
4298-
TC.diagnose(assocType->getLoc(),
4301+
TC.diagnose(AT->getLoc(),
42994302
diag::associated_type_objc,
4300-
assocType->getName(),
4303+
AT->getName(),
43014304
proto->getName());
43024305
}
4306+
4307+
checkAccessControl(TC, AT);
43034308
}
43044309

43054310
void checkUnsupportedNestedType(NominalTypeDecl *NTD) {
@@ -4651,26 +4656,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
46514656
}
46524657

46534658
void visitProtocolDecl(ProtocolDecl *PD) {
4654-
TC.checkDeclAttributesEarly(PD);
4655-
TC.computeAccessLevel(PD);
4656-
4657-
if (IsFirstPass) {
4658-
checkUnsupportedNestedType(PD);
4659-
}
4660-
46614659
if (!IsFirstPass) {
4662-
checkAccessControl(TC, PD);
4663-
for (auto member : PD->getMembers()) {
4664-
TC.checkUnsupportedProtocolType(member);
4665-
checkAccessControl(TC, member);
4666-
}
4667-
TC.checkInheritanceClause(PD);
4668-
4669-
GenericTypeToArchetypeResolver resolver(PD);
4670-
TC.validateWhereClauses(PD, &resolver);
46714660
return;
46724661
}
46734662

4663+
TC.checkDeclAttributesEarly(PD);
4664+
TC.computeAccessLevel(PD);
4665+
4666+
checkUnsupportedNestedType(PD);
4667+
46744668
TC.validateDecl(PD);
46754669
if (!PD->hasValidSignature())
46764670
return;
@@ -4706,6 +4700,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47064700

47074701
TC.checkDeclAttributes(PD);
47084702

4703+
checkAccessControl(TC, PD);
4704+
for (auto member : PD->getMembers()) {
4705+
TC.checkUnsupportedProtocolType(member);
4706+
}
4707+
TC.checkInheritanceClause(PD);
4708+
4709+
GenericTypeToArchetypeResolver resolver(PD);
4710+
TC.validateWhereClauses(PD, &resolver);
4711+
47094712
if (TC.Context.LangOpts.DebugGenericSignatures) {
47104713
auto requirementsSig =
47114714
GenericSignature::get({PD->getProtocolSelfType()},
@@ -4772,14 +4775,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47724775
// Complain if we should have a body.
47734776
TC.diagnose(FD->getLoc(), diag::func_decl_without_brace);
47744777
}
4775-
}
47764778

4777-
if (!IsFirstPass) {
4778-
checkAccessControl(TC, FD);
47794779
return;
47804780
}
47814781

47824782
TC.validateDecl(FD);
4783+
checkAccessControl(TC, FD);
47834784
}
47844785

47854786

@@ -6300,7 +6301,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63006301
}
63016302

63026303
if (!IsFirstPass) {
6303-
checkAccessControl(TC, CD);
63046304
return;
63056305
}
63066306

@@ -6347,6 +6347,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63476347
}
63486348

63496349
TC.checkDeclAttributes(CD);
6350+
checkAccessControl(TC, CD);
63506351
}
63516352

63526353
void visitDestructorDecl(DestructorDecl *DD) {

0 commit comments

Comments
 (0)