Skip to content

Commit 0f74065

Browse files
committed
Embedded: Add @_unavailableInEmbedded overload ambiguity tests.
1 parent d2f77f4 commit 0f74065

File tree

2 files changed

+60
-13
lines changed

2 files changed

+60
-13
lines changed

test/Sema/availability.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
@available(*, unavailable)
44
func unavailable_foo() {} // expected-note {{'unavailable_foo()' has been explicitly marked unavailable here}}
55

6+
@_unavailableInEmbedded // no-op without -enable-experimental-feature Embedded
7+
public func unavailable_in_embedded() { }
8+
69
func test() {
710
unavailable_foo() // expected-error {{'unavailable_foo()' is unavailable}}
11+
unavailable_in_embedded() // ok
812
}
913

1014
@available(*,unavailable,message: "use 'Int' instead")

test/embedded/availability.swift

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,67 @@
1-
// Building with regular Swift should succeed
2-
// RUN: %target-swift-emit-ir %s -parse-stdlib -wmo
3-
4-
// Building with embedded Swift should produce unavailability errors
5-
// RUN: %target-typecheck-verify-swift -parse-stdlib -enable-experimental-feature Embedded -wmo
1+
// RUN: %target-typecheck-verify-swift -parse-stdlib -enable-experimental-feature Embedded
62

73
// REQUIRES: swift_in_compiler
84

95
@_unavailableInEmbedded
10-
public func embedded() { }
11-
public func regular() {
12-
embedded() // expected-error {{'embedded()' is unavailable: unavailable in embedded Swift}}
13-
// expected-note@-3 {{'embedded()' has been explicitly marked unavailable here}}
14-
}
6+
public struct UnavailableInEmbedded {}
7+
// expected-note@-1 {{'UnavailableInEmbedded' has been explicitly marked unavailable here}}
8+
9+
@available(*, unavailable, message: "always unavailable")
10+
public struct UniverallyUnavailable {}
11+
// expected-note@-1 {{'UniverallyUnavailable' has been explicitly marked unavailable here}}
12+
13+
@_unavailableInEmbedded
14+
public func unavailable_in_embedded() { }
15+
// expected-note@-1 {{'unavailable_in_embedded()' has been explicitly marked unavailable here}}
16+
17+
@available(*, unavailable, message: "always unavailable")
18+
public func universally_unavailable() { }
19+
// expected-note@-1 {{'universally_unavailable()' has been explicitly marked unavailable here}}
1520

1621
@_unavailableInEmbedded
1722
public func unused() { } // no error
1823

24+
public struct S1 {}
25+
public struct S2 {}
26+
1927
@_unavailableInEmbedded
20-
public func called_from_unavailable() { }
28+
public func has_unavailable_in_embedded_overload(_ s1: S1) { }
29+
30+
public func has_unavailable_in_embedded_overload(_ s2: S2) { }
31+
32+
@available(*, unavailable)
33+
public func has_universally_unavailable_overload(_ s1: S1) { }
34+
35+
public func has_universally_unavailable_overload(_ s2: S2) { }
36+
37+
public func available(
38+
_ uie: UnavailableInEmbedded, // expected-error {{'UnavailableInEmbedded' is unavailable: unavailable in embedded Swift}}
39+
_ uu: UniverallyUnavailable // expected-error {{'UniverallyUnavailable' is unavailable: always unavailable}}
40+
) {
41+
unavailable_in_embedded() // expected-error {{'unavailable_in_embedded()' is unavailable: unavailable in embedded Swift}}
42+
universally_unavailable() // expected-error {{'universally_unavailable()' is unavailable: always unavailable}}
43+
has_unavailable_in_embedded_overload(.init())
44+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
45+
}
46+
2147
@_unavailableInEmbedded
22-
public func also_embedded() {
23-
called_from_unavailable() // no error
48+
public func also_unavailable_in_embedded(
49+
_ uie: UnavailableInEmbedded, // OK
50+
_ uu: UniverallyUnavailable // FIXME: should be an error
51+
) {
52+
unavailable_in_embedded() // OK
53+
universally_unavailable() // FIXME: should be an error
54+
has_unavailable_in_embedded_overload(.init()) // FIXME: should be ambiguous
55+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
56+
}
57+
58+
@available(*, unavailable)
59+
public func also_universally_unavailable(
60+
_ uie: UnavailableInEmbedded, // OK
61+
_ uu: UniverallyUnavailable // OK
62+
) {
63+
unavailable_in_embedded() // FIXME: should be an error
64+
universally_unavailable() // FIXME: should be an error
65+
has_unavailable_in_embedded_overload(.init()) // not ambiguous, selects available overload
66+
has_universally_unavailable_overload(.init()) // not ambiguous, selects available overload
2467
}

0 commit comments

Comments
 (0)