Skip to content

Commit f348fb1

Browse files
authored
Merge pull request #21864 from xedin/adjust-the-underadjusted-formal-access
[AST] If access control is disabled adjust declaration access to maxi…
2 parents 4b73018 + b78ffa7 commit f348fb1

File tree

4 files changed

+16
-21
lines changed

4 files changed

+16
-21
lines changed

lib/AST/ASTVerifier.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,8 @@ class Verifier : public ASTWalker {
869869

870870
if (D->hasAccess()) {
871871
PrettyStackTraceDecl debugStack("verifying access", D);
872-
if (D->getFormalAccessScope().isPublic() &&
872+
if (!D->getASTContext().isAccessControlDisabled() &&
873+
D->getFormalAccessScope().isPublic() &&
873874
D->getFormalAccess() < AccessLevel::Public) {
874875
Out << "non-public decl has no formal access scope\n";
875876
D->dump(Out);

lib/AST/Decl.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2578,9 +2578,9 @@ bool ValueDecl::shouldHideFromEditor() const {
25782578
return false;
25792579
}
25802580

2581-
/// Return the access level of an internal or public declaration
2582-
/// that's been testably imported.
2583-
static AccessLevel getTestableOrPrivateImportsAccess(const ValueDecl *decl) {
2581+
/// Return maximally open access level which could be associated with the
2582+
/// given declaration accounting for @testable importers.
2583+
static AccessLevel getMaximallyOpenAccessFor(const ValueDecl *decl) {
25842584
// Non-final classes are considered open to @testable importers.
25852585
if (auto cls = dyn_cast<ClassDecl>(decl)) {
25862586
if (!cls->isFinal())
@@ -2606,6 +2606,11 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
26062606
AccessLevel access,
26072607
const DeclContext *useDC,
26082608
bool treatUsableFromInlineAsPublic) {
2609+
// If access control is disabled in the current context, adjust
2610+
// access level of the current declaration to be as open as possible.
2611+
if (useDC && VD->getASTContext().isAccessControlDisabled())
2612+
return getMaximallyOpenAccessFor(VD);
2613+
26092614
if (treatUsableFromInlineAsPublic &&
26102615
access == AccessLevel::Internal &&
26112616
VD->isUsableFromInline()) {
@@ -2618,7 +2623,7 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
26182623
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext());
26192624
if (!useSF) return access;
26202625
if (useSF->hasTestableOrPrivateImport(access, VD))
2621-
return getTestableOrPrivateImportsAccess(VD);
2626+
return getMaximallyOpenAccessFor(VD);
26222627
}
26232628

26242629
return access;
@@ -2646,16 +2651,16 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
26462651
case AccessLevel::Internal:
26472652
if (getModuleContext()->isTestingEnabled() ||
26482653
getModuleContext()->arePrivateImportsEnabled())
2649-
effectiveAccess = getTestableOrPrivateImportsAccess(this);
2654+
effectiveAccess = getMaximallyOpenAccessFor(this);
26502655
break;
26512656
case AccessLevel::FilePrivate:
26522657
if (getModuleContext()->arePrivateImportsEnabled())
2653-
effectiveAccess = getTestableOrPrivateImportsAccess(this);
2658+
effectiveAccess = getMaximallyOpenAccessFor(this);
26542659
break;
26552660
case AccessLevel::Private:
26562661
effectiveAccess = AccessLevel::FilePrivate;
26572662
if (getModuleContext()->arePrivateImportsEnabled())
2658-
effectiveAccess = getTestableOrPrivateImportsAccess(this);
2663+
effectiveAccess = getMaximallyOpenAccessFor(this);
26592664
break;
26602665
}
26612666

@@ -2851,9 +2856,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
28512856
case AccessLevel::FilePrivate:
28522857
if (useDC->getModuleScopeContext() != sourceDC->getModuleScopeContext()) {
28532858
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext());
2854-
if (useSF && useSF->hasTestableOrPrivateImport(access, VD))
2855-
return true;
2856-
return false;
2859+
return useSF && useSF->hasTestableOrPrivateImport(access, VD);
28572860
}
28582861
return true;
28592862
case AccessLevel::Internal: {
@@ -2862,10 +2865,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
28622865
if (useFile->getParentModule() == sourceModule)
28632866
return true;
28642867
auto *useSF = dyn_cast<SourceFile>(useFile);
2865-
if (!useSF) return false;
2866-
if (useSF->hasTestableOrPrivateImport(access, sourceModule))
2867-
return true;
2868-
return false;
2868+
return useSF && useSF->hasTestableOrPrivateImport(access, sourceModule);
28692869
}
28702870
case AccessLevel::Public:
28712871
case AccessLevel::Open:

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,9 +1274,6 @@ bool WitnessChecker::checkWitnessAccess(ValueDecl *requirement,
12741274
ValueDecl *witness,
12751275
bool *isSetter) {
12761276
*isSetter = false;
1277-
if (TC.Context.isAccessControlDisabled())
1278-
return false;
1279-
12801277
AccessScope actualScopeToCheck = getRequiredAccessScope();
12811278

12821279
// Setting the 'forConformance' flag means that we admit witnesses in

lib/Sema/TypeCheckProtocol.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,6 @@ class WitnessChecker {
497497
AccessScope getRequiredAccessScope();
498498

499499
bool isUsableFromInlineRequired() {
500-
if (TC.Context.isAccessControlDisabled())
501-
return false;
502-
503500
assert(RequiredAccessScopeAndUsableFromInline.hasValue() &&
504501
"must check access first using getRequiredAccessScope");
505502
return RequiredAccessScopeAndUsableFromInline.getValue().second;

0 commit comments

Comments
 (0)