@@ -4260,47 +4260,51 @@ 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) {
42704270 if (!IsFirstPass) {
4271- checkAccessControl (TC, SD);
42724271 return ;
42734272 }
42744273
42754274 TC.validateDecl (SD);
4276-
42774275 TC.checkDeclAttributes (SD);
4276+ checkAccessControl (TC, SD);
42784277 }
42794278
42804279 void visitTypeAliasDecl (TypeAliasDecl *TAD) {
4280+ if (!IsFirstPass) {
4281+ return ;
4282+ }
4283+
42814284 TC.checkDeclAttributesEarly (TAD);
42824285 TC.computeAccessLevel (TAD);
42834286
4284- if (IsFirstPass)
4285- TC.validateDecl (TAD);
4286-
4287- if (!IsFirstPass)
4288- checkAccessControl (TC, TAD);
4289-
4287+ TC.validateDecl (TAD);
42904288 TC.checkDeclAttributes (TAD);
4289+ checkAccessControl (TC, TAD);
42914290 }
42924291
4293- void visitAssociatedTypeDecl (AssociatedTypeDecl *assocType) {
4294- if (!assocType->hasValidationStarted ())
4295- TC.validateDecl (assocType);
4292+ void visitAssociatedTypeDecl (AssociatedTypeDecl *AT) {
4293+ if (!IsFirstPass) {
4294+ return ;
4295+ }
42964296
4297- auto *proto = assocType->getProtocol ();
4297+ TC.validateDecl (AT);
4298+
4299+ auto *proto = AT->getProtocol ();
42984300 if (proto->isObjC ()) {
4299- TC.diagnose (assocType ->getLoc (),
4301+ TC.diagnose (AT ->getLoc (),
43004302 diag::associated_type_objc,
4301- assocType ->getName (),
4303+ AT ->getName (),
43024304 proto->getName ());
43034305 }
4306+
4307+ checkAccessControl (TC, AT);
43044308 }
43054309
43064310 void checkUnsupportedNestedType (NominalTypeDecl *NTD) {
@@ -4366,28 +4370,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
43664370 checkCircularity (TC, ED, diag::circular_enum_inheritance,
43674371 diag::enum_here, path);
43684372 }
4369- {
4370- // Check for duplicate enum members.
4371- llvm::DenseMap<Identifier, EnumElementDecl *> Elements;
4372- bool hasErrors = false ;
4373- for (auto *EED : ED->getAllElements ()) {
4374- auto Res = Elements.insert ({ EED->getName (), EED });
4375- if (!Res.second ) {
4376- EED->setInvalid ();
4377-
4378- auto PreviousEED = Res.first ->second ;
4379- TC.diagnose (EED->getLoc (), diag::duplicate_enum_element);
4380- TC.diagnose (PreviousEED->getLoc (),
4381- diag::previous_decldef, true , EED->getName ());
4382- hasErrors = true ;
4383- }
4384- }
4385-
4386- // If one of the cases is invalid, let's mark
4387- // whole enum as invalid as well.
4388- if (hasErrors)
4389- ED->setInvalid ();
4390- }
43914373 }
43924374
43934375 if (!IsFirstPass) {
@@ -4401,7 +4383,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
44014383
44024384 TC.checkConformancesInContext (ED, ED);
44034385 }
4404-
4386+
44054387 for (Decl *member : ED->getMembers ())
44064388 visit (member);
44074389
@@ -4410,29 +4392,31 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
44104392 }
44114393
44124394 void visitStructDecl (StructDecl *SD) {
4395+ if (!IsFirstPass) {
4396+ for (Decl *Member : SD->getMembers ())
4397+ visit (Member);
4398+
4399+ return ;
4400+ }
4401+
44134402 TC.checkDeclAttributesEarly (SD);
44144403 TC.computeAccessLevel (SD);
44154404
4416- if (IsFirstPass) {
4417- checkUnsupportedNestedType (SD);
4418-
4419- TC.validateDecl (SD);
4420- TC.DeclsToFinalize .remove (SD);
4421- TC.addImplicitConstructors (SD);
4422- }
4405+ checkUnsupportedNestedType (SD);
44234406
4424- if (!IsFirstPass) {
4425- checkAccessControl (TC, SD);
4407+ TC. validateDecl (SD);
4408+ TC. DeclsToFinalize . remove ( SD);
44264409
4427- if (!SD->isInvalid ())
4428- TC.checkConformancesInContext (SD, SD);
4429- }
4410+ TC.addImplicitConstructors (SD);
44304411
4431- // Visit each of the members.
44324412 for (Decl *Member : SD->getMembers ())
44334413 visit (Member);
44344414
44354415 TC.checkDeclAttributes (SD);
4416+ checkAccessControl (TC, SD);
4417+
4418+ if (!SD->isInvalid ())
4419+ TC.checkConformancesInContext (SD, SD);
44364420 }
44374421
44384422 // / Check whether the given properties can be @NSManaged in this class.
@@ -4674,26 +4658,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
46744658 }
46754659
46764660 void visitProtocolDecl (ProtocolDecl *PD) {
4677- TC.checkDeclAttributesEarly (PD);
4678- TC.computeAccessLevel (PD);
4679-
4680- if (IsFirstPass) {
4681- checkUnsupportedNestedType (PD);
4682- }
4683-
46844661 if (!IsFirstPass) {
4685- checkAccessControl (TC, PD);
4686- for (auto member : PD->getMembers ()) {
4687- TC.checkUnsupportedProtocolType (member);
4688- checkAccessControl (TC, member);
4689- }
4690- TC.checkInheritanceClause (PD);
4691-
4692- GenericTypeToArchetypeResolver resolver (PD);
4693- TC.validateWhereClauses (PD, &resolver);
46944662 return ;
46954663 }
46964664
4665+ TC.checkDeclAttributesEarly (PD);
4666+ TC.computeAccessLevel (PD);
4667+
4668+ checkUnsupportedNestedType (PD);
4669+
46974670 TC.validateDecl (PD);
46984671 if (!PD->hasValidSignature ())
46994672 return ;
@@ -4729,6 +4702,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47294702
47304703 TC.checkDeclAttributes (PD);
47314704
4705+ checkAccessControl (TC, PD);
4706+ for (auto member : PD->getMembers ()) {
4707+ TC.checkUnsupportedProtocolType (member);
4708+ }
4709+ TC.checkInheritanceClause (PD);
4710+
4711+ GenericTypeToArchetypeResolver resolver (PD);
4712+ TC.validateWhereClauses (PD, &resolver);
4713+
47324714 if (TC.Context .LangOpts .DebugGenericSignatures ) {
47334715 auto requirementsSig =
47344716 GenericSignature::get ({PD->getProtocolSelfType ()},
@@ -4795,14 +4777,12 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
47954777 // Complain if we should have a body.
47964778 TC.diagnose (FD->getLoc (), diag::func_decl_without_brace);
47974779 }
4798- }
47994780
4800- if (!IsFirstPass) {
4801- checkAccessControl (TC, FD);
48024781 return ;
48034782 }
48044783
48054784 TC.validateDecl (FD);
4785+ checkAccessControl (TC, FD);
48064786 }
48074787
48084788
@@ -6206,90 +6186,92 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
62066186
62076187 void visitEnumElementDecl (EnumElementDecl *EED) {
62086188 if (!IsFirstPass) {
6209- checkAccessControl (TC, EED);
62106189 return ;
62116190 }
62126191
62136192 TC.validateDecl (EED);
62146193 TC.checkDeclAttributes (EED);
6194+ checkAccessControl (TC, EED);
62156195 }
62166196
62176197 void visitExtensionDecl (ExtensionDecl *ED) {
6198+ if (!IsFirstPass) {
6199+ for (Decl *Member : ED->getMembers ())
6200+ visit (Member);
6201+ return ;
6202+ }
6203+
62186204 TC.validateExtension (ED);
62196205
62206206 TC.checkDeclAttributesEarly (ED);
62216207
6222- if (IsFirstPass) {
6223- if (auto extendedTy = ED->getExtendedType ()) {
6224- if (!extendedTy->is <NominalType>() &&
6225- !extendedTy->is <BoundGenericType>() &&
6226- !extendedTy->hasError ()) {
6227- // FIXME: Redundant diagnostic test here?
6228- TC.diagnose (ED->getStartLoc (), diag::non_nominal_extension,
6229- extendedTy);
6230- // FIXME: It would be nice to point out where we found the named type
6231- // declaration, if any.
6232- ED->setInvalid ();
6208+ if (auto extendedTy = ED->getExtendedType ()) {
6209+ if (!extendedTy->is <NominalType>() &&
6210+ !extendedTy->is <BoundGenericType>() &&
6211+ !extendedTy->hasError ()) {
6212+ // FIXME: Redundant diagnostic test here?
6213+ TC.diagnose (ED->getStartLoc (), diag::non_nominal_extension,
6214+ extendedTy);
6215+ // FIXME: It would be nice to point out where we found the named type
6216+ // declaration, if any.
6217+ ED->setInvalid ();
6218+ }
6219+ }
6220+
6221+ TC.checkInheritanceClause (ED);
6222+ if (auto extendedTy = ED->getExtendedType ()) {
6223+ if (auto nominal = extendedTy->getAnyNominal ()) {
6224+ TC.validateDecl (nominal);
6225+ if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6226+ TC.requestNominalLayout (classDecl);
6227+
6228+ // Check the raw values of an enum, since we might synthesize
6229+ // RawRepresentable while checking conformances on this extension.
6230+ if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6231+ if (enumDecl->hasRawType ())
6232+ checkEnumRawValues (TC, enumDecl);
62336233 }
62346234 }
6235-
6236- TC.checkInheritanceClause (ED);
6237- if (auto extendedTy = ED->getExtendedType ()) {
6238- if (auto nominal = extendedTy->getAnyNominal ()) {
6239- TC.validateDecl (nominal);
6240- if (auto *classDecl = dyn_cast<ClassDecl>(nominal))
6241- TC.requestNominalLayout (classDecl);
6242-
6243- // Check the raw values of an enum, since we might synthesize
6244- // RawRepresentable while checking conformances on this extension.
6245- if (auto enumDecl = dyn_cast<EnumDecl>(nominal)) {
6246- if (enumDecl->hasRawType ())
6247- checkEnumRawValues (TC, enumDecl);
6248- }
6249- }
6250- }
6251-
6252- validateAttributes (TC, ED);
62536235 }
62546236
6255- // Check conformances before visiting members, since we might
6256- // synthesize bodies for derived conformances
6257- if (!IsFirstPass) {
6258- TC.computeDefaultAccessLevel (ED);
6259- if (auto *AA = ED->getAttrs ().getAttribute <AccessControlAttr>()) {
6260- const auto access = AA->getAccess ();
6261- AccessScope desiredAccessScope = AccessScope::getPublic ();
6262- switch (access) {
6263- case AccessLevel::Private:
6264- assert ((ED->isInvalid () ||
6265- ED->getDeclContext ()->isModuleScopeContext ()) &&
6266- " non-top-level extensions make 'private' != 'fileprivate'" );
6267- LLVM_FALLTHROUGH;
6268- case AccessLevel::FilePrivate: {
6269- const DeclContext *DC = ED->getModuleScopeContext ();
6270- bool isPrivate = access == AccessLevel::Private;
6271- desiredAccessScope = AccessScope (DC, isPrivate);
6272- break ;
6273- }
6274- case AccessLevel::Internal:
6275- desiredAccessScope = AccessScope (ED->getModuleContext ());
6276- break ;
6277- case AccessLevel::Public:
6278- case AccessLevel::Open:
6279- break ;
6280- }
6281- checkGenericParamAccess (TC, ED->getGenericParams (), ED,
6282- desiredAccessScope, access);
6283- }
6284- TC.checkConformancesInContext (ED, ED);
6285- }
6237+ validateAttributes (TC, ED);
6238+
6239+ TC.computeDefaultAccessLevel (ED);
62866240
62876241 for (Decl *Member : ED->getMembers ())
62886242 visit (Member);
62896243
6244+ TC.checkConformancesInContext (ED, ED);
6245+
62906246 if (!ED->isInvalid ())
62916247 TC.checkDeclAttributes (ED);
6292- }
6248+
6249+ if (auto *AA = ED->getAttrs ().getAttribute <AccessControlAttr>()) {
6250+ const auto access = AA->getAccess ();
6251+ AccessScope desiredAccessScope = AccessScope::getPublic ();
6252+ switch (access) {
6253+ case AccessLevel::Private:
6254+ assert ((ED->isInvalid () ||
6255+ ED->getDeclContext ()->isModuleScopeContext ()) &&
6256+ " non-top-level extensions make 'private' != 'fileprivate'" );
6257+ LLVM_FALLTHROUGH;
6258+ case AccessLevel::FilePrivate: {
6259+ const DeclContext *DC = ED->getModuleScopeContext ();
6260+ bool isPrivate = access == AccessLevel::Private;
6261+ desiredAccessScope = AccessScope (DC, isPrivate);
6262+ break ;
6263+ }
6264+ case AccessLevel::Internal:
6265+ desiredAccessScope = AccessScope (ED->getModuleContext ());
6266+ break ;
6267+ case AccessLevel::Public:
6268+ case AccessLevel::Open:
6269+ break ;
6270+ }
6271+ checkGenericParamAccess (TC, ED->getGenericParams (), ED,
6272+ desiredAccessScope, access);
6273+ }
6274+ }
62936275
62946276 void visitTopLevelCodeDecl (TopLevelCodeDecl *TLCD) {
62956277 // See swift::performTypeChecking for TopLevelCodeDecl handling.
@@ -6323,7 +6305,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63236305 }
63246306
63256307 if (!IsFirstPass) {
6326- checkAccessControl (TC, CD);
63276308 return ;
63286309 }
63296310
@@ -6370,6 +6351,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
63706351 }
63716352
63726353 TC.checkDeclAttributes (CD);
6354+ checkAccessControl (TC, CD);
63736355 }
63746356
63756357 void visitDestructorDecl (DestructorDecl *DD) {
0 commit comments