From d9c494efead5fae04c3c9f439d2915a2ae7b7c29 Mon Sep 17 00:00:00 2001 From: Allan Shortlidge Date: Fri, 12 Sep 2025 19:47:20 -0700 Subject: [PATCH] Tests: Expand MemberImportVisibility tests. --- .../MemberImportVisibility/members_A.swift | 9 +++- .../MemberImportVisibility/members_B.swift | 8 +++ .../MemberImportVisibility/members_C.swift | 8 +++ .../NameLookup/member_import_visibility.swift | 53 +++++++++++++------ 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/test/NameLookup/Inputs/MemberImportVisibility/members_A.swift b/test/NameLookup/Inputs/MemberImportVisibility/members_A.swift index ccbaa997ceac9..1788d9aa02287 100644 --- a/test/NameLookup/Inputs/MemberImportVisibility/members_A.swift +++ b/test/NameLookup/Inputs/MemberImportVisibility/members_A.swift @@ -8,7 +8,9 @@ public struct Y { } extension Y: P where T: P { } -public struct Z: P { } +public struct Z: P { + public init() {} +} infix operator <<< infix operator >>> @@ -25,6 +27,7 @@ extension X { public static func <<<(a: Self, b: Self) -> Self { a } public struct NestedInA {} + public protocol ProtoNestedInA {} } extension Y { @@ -33,6 +36,10 @@ extension Y { public static func <<<(a: Self, b: Self) -> Self { a } } +extension P where Self == Z { + public static var zInA: Z { Z() } +} + public enum EnumInA { case caseInA } diff --git a/test/NameLookup/Inputs/MemberImportVisibility/members_B.swift b/test/NameLookup/Inputs/MemberImportVisibility/members_B.swift index 3b638b2641c5c..d27dcfdf72e89 100644 --- a/test/NameLookup/Inputs/MemberImportVisibility/members_B.swift +++ b/test/NameLookup/Inputs/MemberImportVisibility/members_B.swift @@ -15,6 +15,7 @@ extension X { public struct NestedInB {} package struct NestedInB_package {} + public protocol ProtoNestedInB {} } // Members with the same names are also declared in C. @@ -22,6 +23,8 @@ extension X { public init(_ x: Int) { self.init() } public func ambiguous() -> Int { return 1 } public func ambiguousDisfavored() -> Int { return 1 } + public var ambiguousProp: Bool { return false } + public struct AmbiguousNestedType { } } extension Y { @@ -30,6 +33,11 @@ extension Y { public static func >>>(a: Self, b: Self) -> Self { b } } +extension P where Self == Z { + public static var zInB: Z { Z() } + public static var zAmbiguous: Z { Z() } +} + public enum EnumInB { case caseInB } diff --git a/test/NameLookup/Inputs/MemberImportVisibility/members_C.swift b/test/NameLookup/Inputs/MemberImportVisibility/members_C.swift index a6784d7254d30..c80eb9abb895a 100644 --- a/test/NameLookup/Inputs/MemberImportVisibility/members_C.swift +++ b/test/NameLookup/Inputs/MemberImportVisibility/members_C.swift @@ -13,6 +13,7 @@ extension X { public static func <>(a: Self, b: Self) -> Self { a } public struct NestedInC {} + public protocol ProtoNestedInC {} } // Members with the same names are also declared in B. @@ -20,6 +21,8 @@ extension X { public init(_ x: Bool) { self.init() } public func ambiguous() -> Bool { return false } @_disfavoredOverload public func ambiguousDisfavored() -> Bool { return false } + public var ambiguousProp: Bool { return true } + public struct AmbiguousNestedType { } } extension Y { @@ -28,6 +31,11 @@ extension Y { public static func <>(a: Self, b: Self) -> Self { a } } +extension P where Self == Z { + public static var zInC: Z { Z() } + public static var zAmbiguous: Z { Z() } +} + public enum EnumInC { case caseInC } diff --git a/test/NameLookup/member_import_visibility.swift b/test/NameLookup/member_import_visibility.swift index 3c5b5411846a6..0f58fd75ece6d 100644 --- a/test/NameLookup/member_import_visibility.swift +++ b/test/NameLookup/member_import_visibility.swift @@ -9,7 +9,7 @@ // REQUIRES: swift_feature_MemberImportVisibility import members_C -// expected-member-visibility-note 20{{add import of module 'members_B'}}{{1-1=internal import members_B\n}} +// expected-member-visibility-note 28{{add import of module 'members_B'}}{{1-1=internal import members_B\n}} func testExtensionMembers(x: X, y: Y) { @@ -66,27 +66,39 @@ func testOperatorMembers(x: X, y: Y) { _ = y <> y } +struct GenericType { } + extension X { - var testProperties: (Bool, Bool, Bool, Bool) { - return ( - propXinA, - propXinB, // expected-member-visibility-error{{property 'propXinB' is not available due to missing import of defining module 'members_B'}} - propXinB_package, // expected-member-visibility-error{{property 'propXinB_package' is not available due to missing import of defining module 'members_B}} - propXinC - ) - } + var testPropertyInA: Bool { propXinA } + var testPropertyInB: Bool { propXinB } // expected-member-visibility-error {{property 'propXinB' is not available due to missing import of defining module 'members_B'}} + 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}} + var testPropertyInC: Bool { propXinC } + + // This is not diagnosed in either mode (the property from the nearest scope is always preferred + var testAmbiguousProp: Bool { ambiguousProp } - func testNestedTypes() { + func testTypeExpressions() { _ = NestedInA.self _ = NestedInB.self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} _ = NestedInB_package.self // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}} + _ = (NestedInB).self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + _ = (NestedInA, NestedInB, NestedInC).self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + _ = GenericType.self // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} _ = NestedInC.self + _ = AmbiguousNestedType.self } - var nestedInA: NestedInA { fatalError() } - var nestedInB: NestedInB { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} - 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'}} - var nestedInC: NestedInC { fatalError() } + var hasNestedInAType: NestedInA { fatalError() } + var hasNestedInBType: NestedInB { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + 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'}} + var hasNestedInBTrivialTupleType: (NestedInB) { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + var hasTupleTypeContainingNestedInB: (NestedInA, NestedInB, NestedInC) { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + var hasNestedInBAsGenericTypeParameter: GenericType { fatalError() } // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}} + var hasNestedInCType: NestedInC { fatalError() } + + func hasNestedInAInGenericReqs(_ t: T) where T: ProtoNestedInA { } + func hasNestedInBInGenericReqs(_ t: T) where T: ProtoNestedInB { } // expected-member-visibility-error{{protocol 'ProtoNestedInB' is not available due to missing import of defining module 'members_B'}} + func hasNestedInCInGenericReqs(_ t: T) where T: ProtoNestedInC { } } extension X.NestedInA {} @@ -94,7 +106,7 @@ extension X.NestedInB {} // expected-member-visibility-error{{struct 'NestedInB' extension X.NestedInB_package {} // expected-member-visibility-error{{struct 'NestedInB_package' is not available due to missing import of defining module 'members_B'}} extension X.NestedInC {} -func testTopLevelTypes() { +func testTypeExpressionsReferencingTopLevelTypes() { _ = EnumInA.self _ = EnumInB.self // expected-error{{cannot find 'EnumInB' in scope}} _ = EnumInB_package.self // expected-error{{cannot find 'EnumInB_package' in scope}} @@ -107,7 +119,8 @@ class DerivedFromClassInC: DerivedClassInC { override func methodInC() {} } -struct ConformsToProtocolInA: ProtocolInA {} // expected-member-visibility-error{{type 'ConformsToProtocolInA' does not conform to protocol 'ProtocolInA'}} expected-member-visibility-note {{add stubs for conformance}} +// FIXME: Visibility of defaultedRequirementInB() should be diagnosed (rdar://154237873) +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}} func testInheritedMethods( a: BaseClassInA, @@ -128,3 +141,11 @@ func testInheritedMethods( b.overriddenMethod() // expected-member-visibility-error{{instance method 'overriddenMethod()' is not available due to missing import of defining module 'members_B'}} c.overriddenMethod() } + +func testLeadingDotSyntax() { + func takesP(_: T) { } + takesP(.zInA) + takesP(.zInB) // expected-member-visibility-error{{static property 'zInB' is not available due to missing import of defining module 'members_B'}} + takesP(.zInC) + takesP(.zAmbiguous) +}