1
1
// RUN: %target-sil-opt -sil-ownership-verifier-enable-testing -ownership-verifier-textual-error-dumper -enable-sil-verify-all=0 %s -o /dev/null 2>&1 | %FileCheck %s
2
2
// REQUIRES: asserts
3
3
4
- import Swift
5
-
6
4
sil_stage canonical
7
5
6
+ import Builtin
7
+
8
8
class Klass {}
9
9
10
10
class KlassUser {
11
11
var field: Klass
12
12
}
13
13
14
+ sil @use_builtinnativeobject_inguaranteed : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> ()
15
+
14
16
// CHECK-LABEL: Function: 'simple_error_ref_element_addr'
15
17
// CHECK-NEXT: Found outside of lifetime use?!
16
18
// CHECK-NEXT: Value: %1 = begin_borrow %0 : $KlassUser // users: %3, %2
@@ -43,16 +45,21 @@ bb0(%0 : @owned $KlassUser):
43
45
return %3 : $Klass
44
46
}
45
47
48
+ enum FakeOptional<T> {
49
+ case none
50
+ case some(T)
51
+ }
52
+
46
53
class OptionalBox<T> {
47
- var t: T?
54
+ var t: FakeOptional<T>
48
55
}
49
56
50
57
// CHECK-NOT: Function: 'inject_enum_addr_test'
51
58
sil [ossa] @inject_enum_addr_test : $@convention(thin) <T> (@owned OptionalBox<T>) -> () {
52
59
bb0(%0 : @owned $OptionalBox<T>):
53
60
%1 = begin_borrow %0 : $OptionalBox<T>
54
61
%2 = ref_element_addr %1 : $OptionalBox<T>, #OptionalBox.t
55
- inject_enum_addr %2 : $*Optional <T>, #Optional .none!enumelt
62
+ inject_enum_addr %2 : $*FakeOptional <T>, #FakeOptional .none!enumelt
56
63
end_borrow %1 : $OptionalBox<T>
57
64
destroy_value %0 : $OptionalBox<T>
58
65
%3 = tuple ()
@@ -64,7 +71,7 @@ sil [ossa] @init_enum_data_addr_test : $@convention(thin) <T> (@owned OptionalBo
64
71
bb0(%0 : @owned $OptionalBox<T>, %1 : $*T):
65
72
%2 = begin_borrow %0 : $OptionalBox<T>
66
73
%3 = ref_element_addr %2 : $OptionalBox<T>, #OptionalBox.t
67
- %4 = init_enum_data_addr %3 : $*Optional <T>, #Optional .some!enumelt
74
+ %4 = init_enum_data_addr %3 : $*FakeOptional <T>, #FakeOptional .some!enumelt
68
75
copy_addr %1 to [initialization] %4 : $*T
69
76
end_borrow %2 : $OptionalBox<T>
70
77
destroy_value %0 : $OptionalBox<T>
@@ -76,6 +83,10 @@ class Box<T> {
76
83
var t: T
77
84
}
78
85
86
+ struct Int {
87
+ var _value: Builtin.Int64
88
+ }
89
+
79
90
// CHECK-NOT: Function: 'unconditional_cast_test'
80
91
sil [ossa] @unconditional_cast_test : $@convention(thin) <T> (@owned Box<T>, @in Int) -> () {
81
92
bb0(%0 : @owned $Box<T>, %1 : $*Int):
@@ -86,4 +97,24 @@ bb0(%0 : @owned $Box<T>, %1 : $*Int):
86
97
destroy_value %0 : $Box<T>
87
98
%4 = tuple ()
88
99
return %4 : $()
89
- }
100
+ }
101
+
102
+ // CHECK-LABEL: Error#: 0. Begin Error in Function: 'store_borrow_result_used_outside_of_borrow_lifetime'
103
+ // CHECK-NEXT: Found outside of lifetime use?!
104
+ // CHECK-NEXT: Value: %1 = begin_borrow %0 : $Builtin.NativeObject // users: %4, %3
105
+ // CHECK-NEXT: Consuming User: end_borrow %1 : $Builtin.NativeObject // id: %4
106
+ // CHECK-NEXT: Non Consuming User: %7 = apply %6(%3) : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> ()
107
+ // CHECK-NEXT: Block: bb0
108
+ sil [ossa] @store_borrow_result_used_outside_of_borrow_lifetime : $@convention(thin) (@owned Builtin.NativeObject) -> () {
109
+ bb0(%0 : @owned $Builtin.NativeObject):
110
+ %0a = begin_borrow %0 : $Builtin.NativeObject
111
+ %1 = alloc_stack $Builtin.NativeObject
112
+ %result = store_borrow %0a to %1 : $*Builtin.NativeObject
113
+ end_borrow %0a : $Builtin.NativeObject
114
+ destroy_value %0 : $Builtin.NativeObject
115
+ %func = function_ref @use_builtinnativeobject_inguaranteed : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> ()
116
+ apply %func(%result) : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> ()
117
+ dealloc_stack %1 : $*Builtin.NativeObject
118
+ %9999 = tuple()
119
+ return %9999 : $()
120
+ }
0 commit comments