@@ -1354,10 +1354,22 @@ void TypeChecker::computeAccessibility(ValueDecl *D) {
13541354 if (!D->hasAccessibility ()) {
13551355 DeclContext *DC = D->getDeclContext ();
13561356 switch (DC->getContextKind ()) {
1357- case DeclContextKind::SerializedLocal:
1357+ case DeclContextKind::TopLevelCodeDecl:
1358+ // Variables declared in a top-level 'guard' statement can be accessed in
1359+ // later top-level code.
1360+ D->setAccessibility (Accessibility::FilePrivate);
1361+ break ;
13581362 case DeclContextKind::AbstractClosureExpr:
1363+ if (isa<ParamDecl>(D)) {
1364+ // Closure parameters may need to be accessible to the enclosing
1365+ // context, for single-expression closures.
1366+ D->setAccessibility (Accessibility::FilePrivate);
1367+ } else {
1368+ D->setAccessibility (Accessibility::Private);
1369+ }
1370+ break ;
1371+ case DeclContextKind::SerializedLocal:
13591372 case DeclContextKind::Initializer:
1360- case DeclContextKind::TopLevelCodeDecl:
13611373 case DeclContextKind::AbstractFunctionDecl:
13621374 case DeclContextKind::SubscriptDecl:
13631375 D->setAccessibility (Accessibility::Private);
@@ -1371,7 +1383,7 @@ void TypeChecker::computeAccessibility(ValueDecl *D) {
13711383 validateAccessibility (generic);
13721384 Accessibility access = Accessibility::Internal;
13731385 if (isa<ProtocolDecl>(generic))
1374- access = generic->getFormalAccess ();
1386+ access = std::max (access, generic->getFormalAccess () );
13751387 D->setAccessibility (access);
13761388 break ;
13771389 }
@@ -3522,9 +3534,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
35223534 assocType->setIsBeingTypeChecked ();
35233535
35243536 TC.checkDeclAttributesEarly (assocType);
3525- if (!assocType->hasAccessibility ())
3526- assocType->setAccessibility (assocType->getProtocol ()->getFormalAccess ());
3527-
3537+ TC.validateAccessibility (assocType);
35283538 TC.checkInheritanceClause (assocType);
35293539
35303540 // Check the default definition, if there is one.
@@ -5785,12 +5795,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
57855795
57865796
57875797 TC.checkDeclAttributesEarly (EED);
5788-
5789- EnumDecl *ED = EED->getParentEnum ();
5790-
5791- if (!EED->hasAccessibility ())
5792- EED->setAccessibility (ED->getFormalAccess ());
5793-
5798+ TC.validateAccessibility (EED);
57945799 EED->setIsBeingTypeChecked ();
57955800
57965801 // Only attempt to validate the argument type or raw value if the element
@@ -5811,6 +5816,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
58115816
58125817 // If we have a raw value, make sure there's a raw type as well.
58135818 if (auto *rawValue = EED->getRawValueExpr ()) {
5819+ EnumDecl *ED = EED->getParentEnum ();
58145820 if (!ED->hasRawType ()) {
58155821 TC.diagnose (rawValue->getLoc (),diag::enum_raw_value_without_raw_type);
58165822 // Recover by setting the raw type as this element's type.
@@ -6522,7 +6528,8 @@ void TypeChecker::validateDecl(ValueDecl *D, bool resolveTypeParams) {
65226528 if (!assocType->hasType ())
65236529 assocType->computeType ();
65246530 if (!typeParam->hasAccessibility ())
6525- typeParam->setAccessibility (nominal->getFormalAccess ());
6531+ typeParam->setAccessibility (std::max (nominal->getFormalAccess (),
6532+ Accessibility::Internal));
65266533 break ;
65276534 }
65286535
@@ -6543,7 +6550,8 @@ void TypeChecker::validateDecl(ValueDecl *D, bool resolveTypeParams) {
65436550 if (!assocType->hasType ())
65446551 assocType->computeType ();
65456552 if (!typeParam->hasAccessibility ())
6546- typeParam->setAccessibility (fn->getFormalAccess ());
6553+ typeParam->setAccessibility (std::max (fn->getFormalAccess (),
6554+ Accessibility::Internal));
65476555 break ;
65486556 }
65496557 }
@@ -6905,7 +6913,8 @@ void TypeChecker::validateAccessibility(ValueDecl *D) {
69056913 auto assocType = cast<AssociatedTypeDecl>(D);
69066914 auto prot = assocType->getProtocol ();
69076915 validateAccessibility (prot);
6908- assocType->setAccessibility (prot->getFormalAccess ());
6916+ assocType->setAccessibility (std::max (prot->getFormalAccess (),
6917+ Accessibility::Internal));
69096918 break ;
69106919 }
69116920
@@ -6928,7 +6937,8 @@ void TypeChecker::validateAccessibility(ValueDecl *D) {
69286937 } else {
69296938 auto container = cast<NominalTypeDecl>(D->getDeclContext ());
69306939 validateAccessibility (container);
6931- D->setAccessibility (container->getFormalAccess ());
6940+ D->setAccessibility (std::max (container->getFormalAccess (),
6941+ Accessibility::Internal));
69326942 }
69336943 break ;
69346944 }
0 commit comments