Skip to content

Commit 864e450

Browse files
authored
Merge pull request #84271 from tshortli/member-import-visibility-tests
Tests: Expand MemberImportVisibility tests
2 parents 2ee42b8 + d9c494e commit 864e450

File tree

4 files changed

+61
-17
lines changed

4 files changed

+61
-17
lines changed

test/NameLookup/Inputs/MemberImportVisibility/members_A.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ public struct Y<T> { }
88

99
extension Y: P where T: P { }
1010

11-
public struct Z: P { }
11+
public struct Z: P {
12+
public init() {}
13+
}
1214

1315
infix operator <<<
1416
infix operator >>>
@@ -25,6 +27,7 @@ extension X {
2527
public static func <<<(a: Self, b: Self) -> Self { a }
2628

2729
public struct NestedInA {}
30+
public protocol ProtoNestedInA {}
2831
}
2932

3033
extension Y {
@@ -33,6 +36,10 @@ extension Y {
3336
public static func <<<(a: Self, b: Self) -> Self { a }
3437
}
3538

39+
extension P where Self == Z {
40+
public static var zInA: Z { Z() }
41+
}
42+
3643
public enum EnumInA {
3744
case caseInA
3845
}

test/NameLookup/Inputs/MemberImportVisibility/members_B.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@ extension X {
1515

1616
public struct NestedInB {}
1717
package struct NestedInB_package {}
18+
public protocol ProtoNestedInB {}
1819
}
1920

2021
// Members with the same names are also declared in C.
2122
extension X {
2223
public init(_ x: Int) { self.init() }
2324
public func ambiguous() -> Int { return 1 }
2425
public func ambiguousDisfavored() -> Int { return 1 }
26+
public var ambiguousProp: Bool { return false }
27+
public struct AmbiguousNestedType { }
2528
}
2629

2730
extension Y {
@@ -30,6 +33,11 @@ extension Y {
3033
public static func >>>(a: Self, b: Self) -> Self { b }
3134
}
3235

36+
extension P where Self == Z {
37+
public static var zInB: Z { Z() }
38+
public static var zAmbiguous: Z { Z() }
39+
}
40+
3341
public enum EnumInB {
3442
case caseInB
3543
}

test/NameLookup/Inputs/MemberImportVisibility/members_C.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ extension X {
1313
public static func <>(a: Self, b: Self) -> Self { a }
1414

1515
public struct NestedInC {}
16+
public protocol ProtoNestedInC {}
1617
}
1718

1819
// Members with the same names are also declared in B.
1920
extension X {
2021
public init(_ x: Bool) { self.init() }
2122
public func ambiguous() -> Bool { return false }
2223
@_disfavoredOverload public func ambiguousDisfavored() -> Bool { return false }
24+
public var ambiguousProp: Bool { return true }
25+
public struct AmbiguousNestedType { }
2326
}
2427

2528
extension Y {
@@ -28,6 +31,11 @@ extension Y {
2831
public static func <>(a: Self, b: Self) -> Self { a }
2932
}
3033

34+
extension P where Self == Z {
35+
public static var zInC: Z { Z() }
36+
public static var zAmbiguous: Z { Z() }
37+
}
38+
3139
public enum EnumInC {
3240
case caseInC
3341
}

test/NameLookup/member_import_visibility.swift

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// REQUIRES: swift_feature_MemberImportVisibility
1010

1111
import members_C
12-
// expected-member-visibility-note 20{{add import of module 'members_B'}}{{1-1=internal import members_B\n}}
12+
// expected-member-visibility-note 28{{add import of module 'members_B'}}{{1-1=internal import members_B\n}}
1313

1414

1515
func testExtensionMembers(x: X, y: Y<Z>) {
@@ -66,35 +66,47 @@ func testOperatorMembers(x: X, y: Y<Z>) {
6666
_ = y <> y
6767
}
6868

69+
struct GenericType<T> { }
70+
6971
extension X {
70-
var testProperties: (Bool, Bool, Bool, Bool) {
71-
return (
72-
propXinA,
73-
propXinB, // expected-member-visibility-error{{property 'propXinB' is not available due to missing import of defining module 'members_B'}}
74-
propXinB_package, // expected-member-visibility-error{{property 'propXinB_package' is not available due to missing import of defining module 'members_B}}
75-
propXinC
76-
)
77-
}
72+
var testPropertyInA: Bool { propXinA }
73+
var testPropertyInB: Bool { propXinB } // expected-member-visibility-error {{property 'propXinB' is not available due to missing import of defining module 'members_B'}}
74+
var testPropertyInB_package: Bool { propXinB_package } // expected-member-visibility-error{{property 'propXinB_package' is not available due to missing import of defining module 'members_B}}
75+
var testPropertyInC: Bool { propXinC }
76+
77+
// This is not diagnosed in either mode (the property from the nearest scope is always preferred
78+
var testAmbiguousProp: Bool { ambiguousProp }
7879

79-
func testNestedTypes() {
80+
func testTypeExpressions() {
8081
_ = NestedInA.self
8182
_ = NestedInB.self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
8283
_ = NestedInB_package.self // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}}
84+
_ = (NestedInB).self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
85+
_ = (NestedInA, NestedInB, NestedInC).self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
86+
_ = GenericType<NestedInB>.self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
8387
_ = NestedInC.self
88+
_ = AmbiguousNestedType.self
8489
}
8590

86-
var nestedInA: NestedInA { fatalError() }
87-
var nestedInB: NestedInB { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
88-
var nestedInB_package: NestedInB_package { fatalError() } // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}}
89-
var nestedInC: NestedInC { fatalError() }
91+
var hasNestedInAType: NestedInA { fatalError() }
92+
var hasNestedInBType: NestedInB { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
93+
var hasNestedInB_packageType: NestedInB_package { fatalError() } // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}}
94+
var hasNestedInBTrivialTupleType: (NestedInB) { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
95+
var hasTupleTypeContainingNestedInB: (NestedInA, NestedInB, NestedInC) { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
96+
var hasNestedInBAsGenericTypeParameter: GenericType<NestedInB> { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
97+
var hasNestedInCType: NestedInC { fatalError() }
98+
99+
func hasNestedInAInGenericReqs<T>(_ t: T) where T: ProtoNestedInA { }
100+
func hasNestedInBInGenericReqs<T>(_ t: T) where T: ProtoNestedInB { } // expected-member-visibility-error{{protocol 'ProtoNestedInB' is not available due to missing import of defining module 'members_B'}}
101+
func hasNestedInCInGenericReqs<T>(_ t: T) where T: ProtoNestedInC { }
90102
}
91103

92104
extension X.NestedInA {}
93105
extension X.NestedInB {} // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
94106
extension X.NestedInB_package {} // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}}
95107
extension X.NestedInC {}
96108

97-
func testTopLevelTypes() {
109+
func testTypeExpressionsReferencingTopLevelTypes() {
98110
_ = EnumInA.self
99111
_ = EnumInB.self // expected-error{{cannot find 'EnumInB' in scope}}
100112
_ = EnumInB_package.self // expected-error{{cannot find 'EnumInB_package' in scope}}
@@ -107,7 +119,8 @@ class DerivedFromClassInC: DerivedClassInC {
107119
override func methodInC() {}
108120
}
109121

110-
struct ConformsToProtocolInA: ProtocolInA {} // expected-member-visibility-error{{type 'ConformsToProtocolInA' does not conform to protocol 'ProtocolInA'}} expected-member-visibility-note {{add stubs for conformance}}
122+
// FIXME: Visibility of defaultedRequirementInB() should be diagnosed (rdar://154237873)
123+
struct ConformsToProtocolInA: ProtocolInA {} // expected-member-visibility-error{{type 'ConformsToProtocolInA' does not conform to protocol 'ProtocolInA'}} expected-member-visibility-note {{add stubs for conformance}}{{44-44=\n func defaultedRequirementInB() {\n <#code#>\n \}\n}}
111124

112125
func testInheritedMethods(
113126
a: BaseClassInA,
@@ -128,3 +141,11 @@ func testInheritedMethods(
128141
b.overriddenMethod() // expected-member-visibility-error{{instance method 'overriddenMethod()' is not available due to missing import of defining module 'members_B'}}
129142
c.overriddenMethod()
130143
}
144+
145+
func testLeadingDotSyntax() {
146+
func takesP<T: P>(_: T) { }
147+
takesP(.zInA)
148+
takesP(.zInB) // expected-member-visibility-error{{static property 'zInB' is not available due to missing import of defining module 'members_B'}}
149+
takesP(.zInC)
150+
takesP(.zAmbiguous)
151+
}

0 commit comments

Comments
 (0)