Files
swift-mirror/test/NameLookup/members_transitive.swift
Allan Shortlidge 9aab6ef33e AST: Fix MemberImportVisibility handling of @_exported imports.
In existing Swift, an `@_exported import` in any source file makes the
declarations from the imported module visible in all source files. It's unclear
whether this is an explicit decision or is simply and unintended consequence of
effectively adding an implicit import to each source file for the module being
compiled.

Although it's not clear whether this behavior is desirable, the behavior of
member lookup when the MemberImportVisibility feature is enabled should align
with it in order to avoid causing unnecessary churn in required imports.

Resolves rdar://132525152.
2024-07-26 10:20:41 -07:00

78 lines
3.8 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -o %t %S/Inputs/MemberImportVisibility/members_A.swift
// RUN: %target-swift-frontend -emit-module -I %t -o %t -package-name TestPackage %S/Inputs/MemberImportVisibility/members_B.swift
// RUN: %target-swift-frontend -emit-module -I %t -o %t %S/Inputs/MemberImportVisibility/members_C.swift
// RUN: %target-swift-frontend -typecheck %s -I %t -verify -swift-version 5 -package-name TestPackage
// RUN: %target-swift-frontend -typecheck %s -I %t -verify -swift-version 6 -package-name TestPackage
// RUN: %target-swift-frontend -typecheck %s -I %t -verify -swift-version 5 -package-name TestPackage -enable-experimental-feature MemberImportVisibility -verify-additional-prefix member-visibility-
import members_C
// expected-member-visibility-note 11{{add import of module 'members_B'}}{{1-1=import members_B\n}}
func testExtensionMembers(x: X, y: Y<Z>) {
x.XinA()
y.YinA()
x.XinB() // expected-member-visibility-error{{instance method 'XinB()' is not available due to missing import of defining module 'members_B'}}
x.XinB_package() // expected-member-visibility-error{{instance method 'XinB_package()' is not available due to missing import of defining module 'members_B'}}
y.YinB() // expected-member-visibility-error{{instance method 'YinB()' is not available due to missing import of defining module 'members_B'}}
x.XinC()
y.YinC()
}
func testOperatorMembers(x: X, y: Y<Z>) {
_ = x <<< x
_ = y <<< y
_ = x >>> x // expected-error{{cannot find operator '>>>' in scope}}
_ = y >>> y // expected-error{{cannot find operator '>>>' in scope}}
_ = x <> x
_ = y <> y
}
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
)
}
func testNestedTypes() {
_ = 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'}}
_ = NestedInC.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() }
}
extension X.NestedInA {}
extension X.NestedInB {} // expected-member-visibility-error{{struct 'NestedInB' is not available due to missing import of defining module 'members_B'}}
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() {
_ = EnumInA.self
_ = EnumInB.self // expected-error{{cannot find 'EnumInB' in scope}}
_ = EnumInB_package.self // expected-error{{cannot find 'EnumInB_package' in scope}}
_ = EnumInC.self
}
class DerivedFromClassInC: DerivedClassInC {
override func methodInA() {}
override func methodInB() {} // expected-member-visibility-error{{method does not override any method from its superclass}}
override func methodInC() {}
}
struct ConformsToProtocolInA: ProtocolInA {} // expected-member-visibility-error{{type 'ConformsToProtocolInA' does not conform to protocol 'ProtocolInA'}}