Skip to content

Commit fa5051d

Browse files
authored
Merge pull request #3755 from jrose-apple/private-and-fileprivate
More progress on SE-0025 ('private' and 'fileprivate')
2 parents 45df1ad + ebdee21 commit fa5051d

24 files changed

+140
-81
lines changed

lib/Sema/CodeSynthesis.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,9 +1919,9 @@ ConstructorDecl *swift::createImplicitConstructor(TypeChecker &tc,
19191919
ImplicitConstructorKind ICK) {
19201920
ASTContext &context = tc.Context;
19211921
SourceLoc Loc = decl->getLoc();
1922-
Accessibility accessLevel = decl->getFormalAccess();
1923-
if (!decl->hasClangNode())
1924-
accessLevel = std::min(accessLevel, Accessibility::Internal);
1922+
auto accessLevel = Accessibility::Internal;
1923+
if (decl->hasClangNode())
1924+
accessLevel = std::max(accessLevel, decl->getFormalAccess());
19251925

19261926
// Determine the parameter type of the implicit constructor.
19271927
SmallVector<ParamDecl*, 8> params;
@@ -2116,8 +2116,11 @@ swift::createDesignatedInitOverride(TypeChecker &tc,
21162116
/*GenericParams=*/nullptr, classDecl);
21172117

21182118
ctor->setImplicit();
2119-
ctor->setAccessibility(std::min(classDecl->getFormalAccess(),
2120-
superclassCtor->getFormalAccess()));
2119+
2120+
Accessibility access = classDecl->getFormalAccess();
2121+
access = std::max(access, Accessibility::Internal);
2122+
access = std::min(access, superclassCtor->getFormalAccess());
2123+
ctor->setAccessibility(access);
21212124

21222125
// Make sure the constructor is only as available as its superclass's
21232126
// constructor.

lib/Sema/DerivedConformanceEquatableHashable.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,8 @@ deriveHashable_enum_hashValue(TypeChecker &tc, Decl *parentDecl,
417417
interfaceType = FunctionType::get(selfType, methodType);
418418

419419
getterDecl->setInterfaceType(interfaceType);
420-
getterDecl->setAccessibility(enumDecl->getFormalAccess());
420+
getterDecl->setAccessibility(std::max(Accessibility::Internal,
421+
enumDecl->getFormalAccess()));
421422

422423
// If the enum was not imported, the derived conformance is either from the
423424
// enum itself or an extension, in which case we will emit the declaration
@@ -433,7 +434,7 @@ deriveHashable_enum_hashValue(TypeChecker &tc, Decl *parentDecl,
433434
hashValueDecl->setImplicit();
434435
hashValueDecl->makeComputed(SourceLoc(), getterDecl,
435436
nullptr, nullptr, SourceLoc());
436-
hashValueDecl->setAccessibility(enumDecl->getFormalAccess());
437+
hashValueDecl->setAccessibility(getterDecl->getFormalAccess());
437438

438439
Pattern *hashValuePat = new (C) NamedPattern(hashValueDecl, /*implicit*/true);
439440
hashValuePat->setType(intType);

lib/Sema/DerivedConformanceRawRepresentable.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,8 @@ static ConstructorDecl *deriveRawRepresentable_init(TypeChecker &tc,
336336
}
337337
initDecl->setInterfaceType(allocIfaceType);
338338
initDecl->setInitializerInterfaceType(initIfaceType);
339-
initDecl->setAccessibility(enumDecl->getFormalAccess());
339+
initDecl->setAccessibility(std::max(Accessibility::Internal,
340+
enumDecl->getFormalAccess()));
340341

341342
// If the enum was not imported, the derived conformance is either from the
342343
// enum itself or an extension, in which case we will emit the declaration

lib/Sema/DerivedConformances.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ FuncDecl *DerivedConformance::declareDerivedPropertyGetter(TypeChecker &tc,
151151
} else
152152
interfaceType = type;
153153
getterDecl->setInterfaceType(interfaceType);
154-
getterDecl->setAccessibility(typeDecl->getFormalAccess());
154+
getterDecl->setAccessibility(std::max(typeDecl->getFormalAccess(),
155+
Accessibility::Internal));
155156

156157
// If the enum was not imported, the derived conformance is either from the
157158
// enum itself or an extension, in which case we will emit the declaration
@@ -181,7 +182,7 @@ DerivedConformance::declareDerivedReadOnlyProperty(TypeChecker &tc,
181182
propDecl->setImplicit();
182183
propDecl->makeComputed(SourceLoc(), getterDecl, nullptr, nullptr,
183184
SourceLoc());
184-
propDecl->setAccessibility(typeDecl->getFormalAccess());
185+
propDecl->setAccessibility(getterDecl->getFormalAccess());
185186
propDecl->setInterfaceType(propertyInterfaceType);
186187

187188
Pattern *propPat = new (C) NamedPattern(propDecl, /*implicit*/ true);

lib/Sema/TypeCheckDecl.cpp

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,7 @@ void TypeChecker::finalizeGenericParamList(ArchetypeBuilder &builder,
801801
access = nominal->getFormalAccess();
802802
else
803803
access = Accessibility::Internal;
804+
access = std::max(access, Accessibility::Internal);
804805

805806
// Wire up the archetypes.
806807
for (auto GP : *genericParams) {

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1960,7 +1960,14 @@ void ConformanceChecker::recordTypeWitness(AssociatedTypeDecl *assocType,
19601960
// Inject the typealias into the nominal decl that conforms to the protocol.
19611961
if (auto nominal = DC->getAsNominalTypeOrNominalTypeExtensionContext()) {
19621962
TC.computeAccessibility(nominal);
1963-
aliasDecl->setAccessibility(nominal->getFormalAccess());
1963+
// FIXME: Ideally this would use the protocol's access too---that is,
1964+
// a typealias added for an internal protocol shouldn't need to be
1965+
// public---but that can be problematic if the same type conforms to two
1966+
// protocols with different access levels.
1967+
Accessibility aliasAccess = nominal->getFormalAccess();
1968+
aliasAccess = std::max(aliasAccess, Accessibility::Internal);
1969+
aliasDecl->setAccessibility(aliasAccess);
1970+
19641971
if (nominal == DC) {
19651972
nominal->addMember(aliasDecl);
19661973
} else {

lib/Serialization/Deserialization.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,7 +3036,8 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional<DeclContext *> ForcedContext) {
30363036
elem->setInterfaceType(interfaceType);
30373037
if (isImplicit)
30383038
elem->setImplicit();
3039-
elem->setAccessibility(cast<EnumDecl>(DC)->getFormalAccess());
3039+
elem->setAccessibility(std::max(cast<EnumDecl>(DC)->getFormalAccess(),
3040+
Accessibility::Internal));
30403041

30413042
break;
30423043
}
@@ -3203,7 +3204,8 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional<DeclContext *> ForcedContext) {
32033204
/*selfpat*/nullptr, DC);
32043205
declOrOffset = dtor;
32053206

3206-
dtor->setAccessibility(cast<ClassDecl>(DC)->getFormalAccess());
3207+
dtor->setAccessibility(std::max(cast<ClassDecl>(DC)->getFormalAccess(),
3208+
Accessibility::Internal));
32073209
auto *selfParams = readParameterList();
32083210
selfParams->get(0)->setImplicit(); // self is implicit.
32093211

test/1_stdlib/Runtime.swift.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ extension Int {
287287
var description: String { return "abc" }
288288
}
289289

290-
private class PrivateExtensionClassConformsToP2 : P2 {
290+
fileprivate class PrivateExtensionClassConformsToP2 : P2 {
291291
var description: String { return "def" }
292292
}
293293
}

test/DebugInfo/typealias.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ class DWARF {
88
typealias DIEOffset = UInt32
99
// CHECK-DAG: ![[VOID:.*]] = !DICompositeType({{.*}}identifier: "_TtT_"
1010
// CHECK-DAG: ![[PRIVATETYPE:.*]] = !DIDerivedType(tag: DW_TAG_typedef, name: "_TtaC9typealias5DWARFP{{.+}}11PrivateType",{{.*}} line: [[@LINE+1]], baseType: ![[VOID]])
11-
private typealias PrivateType = ()
12-
private static func usePrivateType() -> PrivateType { return () }
11+
fileprivate typealias PrivateType = ()
12+
fileprivate static func usePrivateType() -> PrivateType { return () }
1313
}
1414

1515
func main () {

test/IDE/complete_override_access_control.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,16 @@ public class TestPublicABC : ProtocolAPrivate, ProtocolBInternal, ProtocolCPubli
112112

113113
// TEST_INTERNAL_ABC: Begin completions, 15 items
114114
// TEST_INTERNAL_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolA: TagPA) {|}{{; name=.+$}}
115-
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: private func protoAFunc(x: TagPA) {|}{{; name=.+$}}
116-
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: private func protoAFuncOptional(x: TagPA) {|}{{; name=.+$}}
115+
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoAFunc(x: TagPA) {|}{{; name=.+$}}
116+
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoAFuncOptional(x: TagPA) {|}{{; name=.+$}}
117117
// TEST_INTERNAL_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolB: TagPB) {|}{{; name=.+$}}
118118
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoBFunc(x: TagPB) {|}{{; name=.+$}}
119119
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoBFuncOptional(x: TagPB) {|}{{; name=.+$}}
120120
// TEST_INTERNAL_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolC: TagPC) {|}{{; name=.+$}}
121121
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoCFunc(x: TagPC) {|}{{; name=.+$}}
122122
// TEST_INTERNAL_ABC-DAG: Decl[InstanceMethod]/Super: func protoCFuncOptional(x: TagPC) {|}{{; name=.+$}}
123-
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: private var protoAVarRW: TagPA
124-
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: private var protoAVarRO: TagPA
123+
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: var protoAVarRW: TagPA
124+
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: var protoAVarRO: TagPA
125125
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: var protoBVarRW: TagPB
126126
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: var protoBVarRO: TagPB
127127
// TEST_INTERNAL_ABC-DAG: Decl[InstanceVar]/Super: var protoCVarRW: TagPC
@@ -130,16 +130,16 @@ public class TestPublicABC : ProtocolAPrivate, ProtocolBInternal, ProtocolCPubli
130130

131131
// TEST_PUBLIC_ABC: Begin completions, 15 items
132132
// TEST_PUBLIC_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolA: TagPA) {|}{{; name=.+$}}
133-
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: private func protoAFunc(x: TagPA) {|}{{; name=.+$}}
134-
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: private func protoAFuncOptional(x: TagPA) {|}{{; name=.+$}}
133+
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: func protoAFunc(x: TagPA) {|}{{; name=.+$}}
134+
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: func protoAFuncOptional(x: TagPA) {|}{{; name=.+$}}
135135
// TEST_PUBLIC_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolB: TagPB) {|}{{; name=.+$}}
136136
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: func protoBFunc(x: TagPB) {|}{{; name=.+$}}
137137
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: func protoBFuncOptional(x: TagPB) {|}{{; name=.+$}}
138138
// TEST_PUBLIC_ABC-DAG: Decl[Constructor]/Super: init(fromProtocolC: TagPC) {|}{{; name=.+$}}
139139
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: public func protoCFunc(x: TagPC) {|}{{; name=.+$}}
140140
// TEST_PUBLIC_ABC-DAG: Decl[InstanceMethod]/Super: public func protoCFuncOptional(x: TagPC) {|}{{; name=.+$}}
141-
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: private var protoAVarRW: TagPA
142-
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: private var protoAVarRO: TagPA
141+
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: var protoAVarRW: TagPA
142+
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: var protoAVarRO: TagPA
143143
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: var protoBVarRW: TagPB
144144
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: var protoBVarRO: TagPB
145145
// TEST_PUBLIC_ABC-DAG: Decl[InstanceVar]/Super: public var protoCVarRW: TagPC

test/IRGen/method_linkage.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,37 @@
77
class Base {
88
// CHECK: define hidden void @_TFC14method_linkage4Base{{.*}}3foofT_T_
99
@inline(never)
10-
private func foo() {
10+
fileprivate func foo() {
1111
}
1212

1313
// CHECK: define internal void @_TFC14method_linkage4Base{{.*}}3barfT_T_
1414
@inline(never)
15-
private final func bar() {
15+
fileprivate final func bar() {
1616
}
1717

1818
// CHECK: define hidden void @_TFC14method_linkage4Base{{.*}}5otherfT_T_
1919
@inline(never)
20-
private func other() {
20+
fileprivate func other() {
2121
}
2222
}
2323
class Derived : Base {
2424
// CHECK: define hidden void @_TFC14method_linkage7Derived{{.*}}3foofT_T_
2525
@inline(never)
26-
private final override func foo() {
26+
fileprivate final override func foo() {
2727
}
2828
}
2929

3030
extension Base {
3131
// CHECK: define internal void @_TFC14method_linkage4Base{{.*}}7extfuncfT_T_
3232
@inline(never)
33-
private func extfunc() {
33+
fileprivate func extfunc() {
3434
}
3535
}
3636

3737
public class PublicClass {
3838
// CHECK: define{{( protected)?}} void @_TFC14method_linkage11PublicClass{{.*}}4pfoofT_T_
3939
@inline(never)
40-
private func pfoo() {
40+
fileprivate func pfoo() {
4141
}
4242

4343
// CHECK: define{{( protected)?}} void @_TFC14method_linkage11PublicClass4pbarfT_T_

test/Inputs/ObjCBridging/Appliances.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extension Refrigerator : _ObjectiveCBridgeable {
3535
}
3636

3737
public struct ManufacturerInfo<DataType: AnyObject> {
38-
private var impl: APPManufacturerInfo<DataType>
38+
fileprivate var impl: APPManufacturerInfo<DataType>
3939
public var value: DataType {
4040
return impl.value
4141
}

test/Interpreter/Inputs/testability_helper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal class Base : CustomStringConvertible {
99

1010
var description: String { return "instance \(id)" }
1111

12-
private func privateFn() -> String {
12+
fileprivate func privateFn() -> String {
1313
return "private \(id)"
1414
}
1515
func callPrivate() -> String {

test/SILGen/Inputs/mangling_private_helper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
public class Base {
2-
private func privateMethod() {}
2+
fileprivate func privateMethod() {}
33
}
44

55
// Demonstrate the need for a vtable entry for privateMethod().

test/SILGen/objc_extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ extension SubSub {
6060

6161
// SR-1025
6262
extension Base {
63-
private static var x = 1
63+
fileprivate static var x = 1
6464
}
6565

6666
// CHECK-LABEL: sil hidden @_TF15objc_extensions19testStaticVarAccessFT_T_

test/SILOptimizer/Inputs/devirt_access_other_module.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
public class ExternalClass {
2-
private func foo() {}
2+
fileprivate func foo() {}
33
}
44

55
public func getExternalClass() -> ExternalClass {

test/SILOptimizer/dead_func_init_method.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Swift
99
import SwiftShims
1010

1111
private class Base {
12-
private init()
12+
init()
1313
}
1414

1515
private class Derived : Base {

0 commit comments

Comments
 (0)