-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathmembers_transitive.swift
103 lines (83 loc) · 5.62 KB
/
members_transitive.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// 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 -verify-additional-prefix ambiguity-
// RUN: %target-swift-frontend -typecheck %s -I %t -verify -swift-version 6 -package-name TestPackage -verify-additional-prefix ambiguity-
// RUN: %target-swift-frontend -typecheck %s -I %t -verify -swift-version 5 -package-name TestPackage -enable-upcoming-feature MemberImportVisibility -verify-additional-prefix member-visibility-
// REQUIRES: swift_feature_MemberImportVisibility
import members_C
// expected-member-visibility-note 16{{add import of module 'members_B'}}{{1-1=internal 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()
_ = X(true)
_ = X(1) // expected-member-visibility-error{{initializer 'init(_:)' is not available due to missing import of defining module 'members_B'}}
_ = x.ambiguous() // expected-ambiguity-error{{ambiguous use of 'ambiguous()'}}
let _: Bool = x.ambiguous()
let _: Int = x.ambiguous() // expected-member-visibility-error{{instance method 'ambiguous()' is not available due to missing import of defining module 'members_B'}}
// ambiguousDisfavored() has two overloads:
// - members_B: public func ambiguousDisfavored() -> Int
// - members_C: @_disfavoredOverload public func ambiguousDisfavored() -> Bool
// With MemberImportVisibility, the overload from members_C should be picked.
// Otherwise, the overload from members_B should be picked.
let disfavoredResult = x.ambiguousDisfavored()
let _: Bool = disfavoredResult // expected-ambiguity-error{{type 'Int' cannot be used as a boolean; test for '!= 0' instead}}
let _: Int = disfavoredResult // expected-member-visibility-error{{cannot convert value of type 'Bool' to specified type 'Int'}}
let _: Bool = x.ambiguousDisfavored()
let _: Int = x.ambiguousDisfavored() // expected-member-visibility-error{{instance method 'ambiguousDisfavored()' is not available due to missing import of defining module 'members_B'}}
}
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{{instance method 'methodInB()' is not available due to missing import of defining module 'members_B'}}
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}}
func testDerivedMethodAccess() {
DerivedClassInC().methodInC()
DerivedClassInC().methodInB() // expected-member-visibility-error{{instance method 'methodInB()' is not available due to missing import of defining module 'members_B'}}
DerivedFromClassInC().methodInB()
}