-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathescapable_generics_casting.swift
55 lines (41 loc) · 1.17 KB
/
escapable_generics_casting.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
// RUN: %target-run-simple-swift(-Xfrontend -sil-verify-all ) | %FileCheck %s
// RUN: %target-run-simple-swift(-O -Xfrontend -sil-verify-all ) | %FileCheck %s
// REQUIRES: executable_test, asserts
// UNSUPPORTED: use_os_stdlib
// UNSUPPORTED: back_deployment_runtime
// REQUIRES: rdar125805695
protocol P {
func speak()
}
extension P {
func speak() { print("hello") }
}
struct Nonescapable: ~Escapable {}
struct Ordinary {}
struct Dog<T: ~Escapable>: Escapable {}
extension Dog: P where T: Escapable {}
func attemptCall(_ a: Any) {
if let value = a as? P {
value.speak()
return
}
print("failed to cast (attemptCall)")
}
defer { main({}) }
func main(_ noEscapeFunc: () -> Void) {
// CHECK: hello
attemptCall(Dog<Ordinary>())
// CHECK: failed to cast (attemptCall)
attemptCall(Dog<Nonescapable>())
// CHECK: function types
print("function types")
// CHECK: hello
attemptCall(Dog<() -> Void>())
// CHECK: failed to cast (attemptCall)
func doFuncCall<F>(_: F.Type) {
attemptCall(Dog<F>())
}
// This is the mangled name for a non-escaping Swift function type.
let fnType = _typeByName("yyXE")!
_openExistential(fnType, do: doFuncCall)
}