@@ -3,38 +3,46 @@ sil_stage canonical
3
3
// RUN: %FileCheck -check-prefix=YAML -input-file=%t.opt.yaml %s
4
4
5
5
import Builtin
6
-
6
+ enum Error {}
7
7
protocol P {
8
8
func f()
9
+ func g() throws
9
10
}
10
11
11
12
extension P {
12
13
func f()
14
+ func g() throws
13
15
}
14
16
15
17
class C<T, U> : P {}
16
18
17
19
sil hidden_external [transparent] [thunk] @witness_thunk : $@convention(witness_method: P) <τ_0_0><τ_1_0, τ_1_1 where τ_0_0 : C<τ_1_0, τ_1_1>> (@in_guaranteed τ_0_0) -> ()
20
+ sil hidden_external [transparent] [thunk] @witness_thunk2 : $@convention(witness_method: P) <τ_0_0><τ_1_0, τ_1_1 where τ_0_0 : C<τ_1_0, τ_1_1>> (@in_guaranteed τ_0_0) -> ()
18
21
19
22
// CHECK-LABEL: sil hidden @caller : $@convention(thin) <T, U> (@owned C<T, U>) -> ()
20
23
// CHECK: [[FN:%.*]] = function_ref @witness_thunk
21
24
// CHECK: apply [[FN]]<C<T, U>, T, U>(
22
25
// CHECK: return
23
26
27
+ // CHECK-LABEL: sil hidden @caller2
28
+ // CHECK: witness_method
29
+ // CHECK: try_apply
30
+ // CHECK: return
31
+
24
32
// YAML: --- !Passed
25
33
// YAML-NEXT: Pass: sil-devirtualizer
26
34
// YAML-NEXT: Name: sil.WitnessMethodDevirtualized
27
35
// YAML-NEXT: DebugLoc:
28
36
// YAML-NEXT: File: {{.*}}/devirt_class_witness_method.sil
29
- // YAML-NEXT: Line: 47
37
+ // YAML-NEXT: Line: 55
30
38
// YAML-NEXT: Column: 8
31
39
// YAML-NEXT: Function: caller
32
40
// YAML-NEXT: Args:
33
41
// YAML-NEXT: - String: 'Devirtualized call to '
34
42
// YAML-NEXT: - Method: '"witness_thunk"'
35
43
// YAML-NEXT: DebugLoc:
36
44
// YAML-NEXT: File: {{.*}}/devirt_class_witness_method.sil
37
- // YAML-NEXT: Line: 17
45
+ // YAML-NEXT: Line: 19
38
46
// YAML-NEXT: Column: 44
39
47
// YAML-NEXT: ...
40
48
@@ -51,10 +59,31 @@ bb0(%0 : $C<T, U>):
51
59
return %9 : $()
52
60
}
53
61
62
+ sil hidden @caller2 : $@convention(thin) <T, U> (@owned C<T, U>) -> () {
63
+ bb0(%0 : $C<T, U>):
64
+ strong_retain %0 : $C<T, U>
65
+ %4 = alloc_stack $C<T, U>
66
+ store %0 to %4 : $*C<T, U>
67
+ %6 = witness_method $C<T, U>, #P.g!1 : <Self where Self : P> (Self) -> () throws -> () : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> @error Error
68
+ try_apply %6<C<T, U>>(%4) : $@convention(witness_method: P) <τ_0_0 where τ_0_0 : P> (@in_guaranteed τ_0_0) -> @error Error, normal bb1, error bb2
69
+
70
+ bb1(%8 : $()):
71
+ br bb3
72
+
73
+ bb2(%11 : $Error):
74
+ br bb3
75
+
76
+ bb3:
77
+ dealloc_stack %4 : $*C<T, U>
78
+ strong_release %0 : $C<T, U>
79
+ %9 = tuple ()
80
+ return %9 : $()
81
+ }
54
82
sil_vtable C {}
55
83
56
84
sil_witness_table hidden <T, U> C<T, U>: P module clsx {
57
85
method #P.f!1: <Self where Self : P> (Self) -> () -> () : @witness_thunk
86
+ method #P.g!1: <Self where Self : P> (Self) -> () throws -> () : @witness_thunk2
58
87
}
59
88
60
89
sil_default_witness_table hidden P {
0 commit comments