Skip to content

Commit 5636cd3

Browse files
authored
Merge pull request #21697 from xedin/fix-repl-subclass
[TypeChecker] Respect access control flag while validating superclass…
2 parents 8fcf884 + ef9e46c commit 5636cd3

File tree

2 files changed

+30
-20
lines changed

2 files changed

+30
-20
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2775,28 +2775,29 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
27752775
}
27762776
}
27772777

2778-
// Require the superclass to be open if this is outside its
2779-
// defining module. But don't emit another diagnostic if we
2780-
// already complained about the class being inherently
2781-
// un-subclassable.
2782-
if (!isInvalidSuperclass &&
2783-
!Super->hasOpenAccess(CD->getDeclContext()) &&
2784-
Super->getModuleContext() != CD->getModuleContext()) {
2785-
TC.diagnose(CD, diag::superclass_not_open, superclassTy);
2786-
isInvalidSuperclass = true;
2787-
}
2778+
if (TC.getLangOpts().EnableAccessControl) {
2779+
// Require the superclass to be open if this is outside its
2780+
// defining module. But don't emit another diagnostic if we
2781+
// already complained about the class being inherently
2782+
// un-subclassable.
2783+
if (!isInvalidSuperclass &&
2784+
!Super->hasOpenAccess(CD->getDeclContext()) &&
2785+
Super->getModuleContext() != CD->getModuleContext()) {
2786+
TC.diagnose(CD, diag::superclass_not_open, superclassTy);
2787+
isInvalidSuperclass = true;
2788+
}
27882789

2789-
// Require superclasses to be open if the subclass is open.
2790-
// This is a restriction we can consider lifting in the future,
2791-
// e.g. to enable a "sealed" superclass whose subclasses are all
2792-
// of one of several alternatives.
2793-
if (!isInvalidSuperclass &&
2794-
CD->getFormalAccess() == AccessLevel::Open &&
2795-
Super->getFormalAccess() != AccessLevel::Open) {
2796-
TC.diagnose(CD, diag::superclass_of_open_not_open, superclassTy);
2797-
TC.diagnose(Super, diag::superclass_here);
2790+
// Require superclasses to be open if the subclass is open.
2791+
// This is a restriction we can consider lifting in the future,
2792+
// e.g. to enable a "sealed" superclass whose subclasses are all
2793+
// of one of several alternatives.
2794+
if (!isInvalidSuperclass &&
2795+
CD->getFormalAccess() == AccessLevel::Open &&
2796+
Super->getFormalAccess() != AccessLevel::Open) {
2797+
TC.diagnose(CD, diag::superclass_of_open_not_open, superclassTy);
2798+
TC.diagnose(Super, diag::superclass_here);
2799+
}
27982800
}
2799-
28002801
}
28012802

28022803
CD->getAllConformances();

test/Interpreter/repl.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,12 @@ if true && true { if true && true { print(true && true) } }
222222
"ok"
223223
// CHECK: = "ok"
224224

225+
// Make sure that class inheritance works
226+
class A {}
227+
class B : A {
228+
override init() {}
229+
func foo() -> String { return "ok" }
230+
}
231+
232+
let _ = B().foo()
233+
// CHECK: = "ok"

0 commit comments

Comments
 (0)