2
2
// REQUIRES: asserts
3
3
4
4
import Builtin
5
- import Swift
6
5
7
6
//////////////////
8
7
// Declarations //
@@ -15,6 +14,11 @@ struct WrapperStruct {
15
14
var cls : Klass
16
15
}
17
16
17
+ enum FakeOptional<T> {
18
+ case none
19
+ case some(T)
20
+ }
21
+
18
22
sil shared [noinline] @blackhole_spl : $@convention(thin) (@guaranteed WrapperStruct) -> () {
19
23
20
24
bb0(%0 : $WrapperStruct):
@@ -259,6 +263,96 @@ bb3(%newborrowi : @guaranteed $WrapperStruct, %newborrowo : @guaranteed $Wrapper
259
263
return %ret : $()
260
264
}
261
265
266
+ // CHECK-NOT: Function: 'borrow_lifetime_discrepency_2'
267
+ sil [ossa] @borrow_lifetime_discrepency_2 : $@convention(thin) (@guaranteed WrapperStruct, @guaranteed WrapperStruct) -> () {
268
+ bb0(%0 : @guaranteed $WrapperStruct, %1 : @guaranteed $WrapperStruct):
269
+ cond_br undef, bb1, bb2
270
+
271
+ bb1:
272
+ %copy0 = copy_value %0 : $WrapperStruct
273
+ %borrow0 = begin_borrow %copy0 : $WrapperStruct
274
+ %borrow0a = begin_borrow %borrow0 : $WrapperStruct
275
+ br bb3(%borrow0a : $WrapperStruct, %borrow0 : $WrapperStruct, %copy0 : $WrapperStruct)
276
+
277
+ bb2:
278
+ %copy1 = copy_value %0 : $WrapperStruct
279
+ %borrow1 = begin_borrow %copy1 : $WrapperStruct
280
+ %borrow1a = begin_borrow %borrow1 : $WrapperStruct
281
+ br bb3(%borrow1a : $WrapperStruct, %borrow1 : $WrapperStruct, %copy1 : $WrapperStruct)
282
+
283
+ bb3(%newborrowi : @guaranteed $WrapperStruct, %newborrowo : @guaranteed $WrapperStruct, %base : @owned $WrapperStruct):
284
+ end_borrow %newborrowi : $WrapperStruct
285
+ end_borrow %newborrowo : $WrapperStruct
286
+ destroy_value %base : $WrapperStruct
287
+ %ret = tuple ()
288
+ return %ret : $()
289
+ }
290
+
291
+ // CHECK-LABEL: Error#: 0. Begin Error in Function: 'borrow_lifetime_discrepency_incorrect_1'
292
+ // CHECK: Found outside of lifetime use?!
293
+ // CHECK: Value: %13 = argument of bb3 : $WrapperStruct // user: %15
294
+ // CHECK: Consuming User: destroy_value %13 : $WrapperStruct // id: %15
295
+ // CHECK: Non Consuming User: end_borrow %12 : $WrapperStruct // id: %16
296
+ // CHECK: Block: bb3
297
+ // CHECK-LABEL: Error#: 0. End Error in Function: 'borrow_lifetime_discrepency_incorrect_1'
298
+ // CHECK-NOT: Error#: 1.
299
+ sil [ossa] @borrow_lifetime_discrepency_incorrect_1 : $@convention(thin) (@guaranteed WrapperStruct, @guaranteed WrapperStruct) -> () {
300
+ bb0(%0 : @guaranteed $WrapperStruct, %1 : @guaranteed $WrapperStruct):
301
+ cond_br undef, bb1, bb2
302
+
303
+ bb1:
304
+ %copy0 = copy_value %0 : $WrapperStruct
305
+ %borrow0 = begin_borrow %copy0 : $WrapperStruct
306
+ %borrow0a = begin_borrow %borrow0 : $WrapperStruct
307
+ br bb3(%borrow0a : $WrapperStruct, %borrow0 : $WrapperStruct, %copy0 : $WrapperStruct)
308
+
309
+ bb2:
310
+ %copy1 = copy_value %0 : $WrapperStruct
311
+ %borrow1 = begin_borrow %copy1 : $WrapperStruct
312
+ %borrow1a = begin_borrow %borrow1 : $WrapperStruct
313
+ br bb3(%borrow1a : $WrapperStruct, %borrow1 : $WrapperStruct, %copy1 : $WrapperStruct)
314
+
315
+ bb3(%newborrowi : @guaranteed $WrapperStruct, %newborrowo : @guaranteed $WrapperStruct, %base : @owned $WrapperStruct):
316
+ end_borrow %newborrowi : $WrapperStruct
317
+ destroy_value %base : $WrapperStruct
318
+ end_borrow %newborrowo : $WrapperStruct
319
+ %ret = tuple ()
320
+ return %ret : $()
321
+ }
322
+
323
+ // CHECK-LABEL: Error#: 0. Begin Error in Function: 'borrow_lifetime_discrepency_incorrect_2'
324
+ // CHECK: Found outside of lifetime use?!
325
+ // CHECK: Value: %12 = argument of bb3 : $WrapperStruct // user: %14
326
+ // CHECK: Consuming User: end_borrow %12 : $WrapperStruct // id: %14
327
+ // CHECK: Non Consuming User: end_borrow %11 : $WrapperStruct // id: %15
328
+ // CHECK: Block: bb3
329
+ // CHECK-LABEL: Error#: 0. End Error in Function: 'borrow_lifetime_discrepency_incorrect_2'
330
+ // CHECK-NOT: Error#: 1.
331
+ sil [ossa] @borrow_lifetime_discrepency_incorrect_2 : $@convention(thin) (@guaranteed WrapperStruct, @guaranteed WrapperStruct) -> () {
332
+ bb0(%0 : @guaranteed $WrapperStruct, %1 : @guaranteed $WrapperStruct):
333
+ cond_br undef, bb1, bb2
334
+
335
+ bb1:
336
+ %copy0 = copy_value %0 : $WrapperStruct
337
+ %borrow0 = begin_borrow %copy0 : $WrapperStruct
338
+ %borrow0a = begin_borrow %borrow0 : $WrapperStruct
339
+ br bb3(%borrow0a : $WrapperStruct, %borrow0 : $WrapperStruct, %copy0 : $WrapperStruct)
340
+
341
+ bb2:
342
+ %copy1 = copy_value %0 : $WrapperStruct
343
+ %borrow1 = begin_borrow %copy1 : $WrapperStruct
344
+ %borrow1a = begin_borrow %borrow1 : $WrapperStruct
345
+ br bb3(%borrow1a : $WrapperStruct, %borrow1 : $WrapperStruct, %copy1 : $WrapperStruct)
346
+
347
+ bb3(%newborrowi : @guaranteed $WrapperStruct, %newborrowo : @guaranteed $WrapperStruct, %base : @owned $WrapperStruct):
348
+ end_borrow %newborrowo : $WrapperStruct
349
+ end_borrow %newborrowi : $WrapperStruct
350
+ destroy_value %base : $WrapperStruct
351
+ %ret = tuple ()
352
+ return %ret : $()
353
+ }
354
+
355
+
262
356
// CHECK-NOT: Function: 'borrow_lifetime_nodiscrepency'
263
357
sil [ossa] @borrow_lifetime_nodiscrepency : $@convention(thin) (@guaranteed WrapperStruct, @guaranteed WrapperStruct) -> () {
264
358
bb0(%0 : @guaranteed $WrapperStruct, %1 : @guaranteed $WrapperStruct):
@@ -601,27 +695,27 @@ bb0(%0 : @owned $Klass):
601
695
602
696
bb1(%1 : @owned $SuperKlass):
603
697
destroy_value %1 : $SuperKlass
604
- %none = enum $Optional <Klass>, #Optional .none!enumelt
605
- %borrownone = begin_borrow %none : $Optional <Klass>
606
- br bb3(%borrownone : $Optional <Klass>, %none : $Optional <Klass>)
698
+ %none = enum $FakeOptional <Klass>, #FakeOptional .none!enumelt
699
+ %borrownone = begin_borrow %none : $FakeOptional <Klass>
700
+ br bb3(%borrownone : $FakeOptional <Klass>, %none : $FakeOptional <Klass>)
607
701
608
702
bb2(%2 : @owned $Klass):
609
- %some = enum $Optional <Klass>, #Optional .some!enumelt, %2 : $Klass
610
- %borrowsome = begin_borrow %some : $Optional <Klass>
611
- br bb3(%borrowsome : $Optional <Klass>, %some : $Optional <Klass>)
703
+ %some = enum $FakeOptional <Klass>, #FakeOptional .some!enumelt, %2 : $Klass
704
+ %borrowsome = begin_borrow %some : $FakeOptional <Klass>
705
+ br bb3(%borrowsome : $FakeOptional <Klass>, %some : $FakeOptional <Klass>)
612
706
613
- bb3(%borrow : @guaranteed $Optional <Klass>, %mKlass : @owned $Optional <Klass>):
614
- end_borrow %borrow : $Optional <Klass>
615
- destroy_value %mKlass : $Optional <Klass>
707
+ bb3(%borrow : @guaranteed $FakeOptional <Klass>, %mKlass : @owned $FakeOptional <Klass>):
708
+ end_borrow %borrow : $FakeOptional <Klass>
709
+ destroy_value %mKlass : $FakeOptional <Klass>
616
710
%9999 = tuple()
617
711
return %9999 : $()
618
712
}
619
713
620
714
// CHECK-LABEL: Error#: 0. Begin Error in Function: 'test_borrow_checked_cast_switch_enum_control_flow_incorrect'
621
715
// CHECK: Found outside of lifetime use?!
622
- // CHECK: Value: %12 = argument of bb3 : $Optional <Klass>
623
- // CHECK: Consuming User: destroy_value %12 : $Optional <Klass>
624
- // CHECK: Non Consuming User: end_borrow %11 : $Optional <Klass>
716
+ // CHECK: Value: %12 = argument of bb3 : $FakeOptional <Klass>
717
+ // CHECK: Consuming User: destroy_value %12 : $FakeOptional <Klass>
718
+ // CHECK: Non Consuming User: end_borrow %11 : $FakeOptional <Klass>
625
719
// CHECK: Block: bb3
626
720
// CHECK-LABEL: Error#: 0. End Error in Function: 'test_borrow_checked_cast_switch_enum_control_flow_incorrect'
627
721
// CHECK-NOT: Error#: {{[0-9][0-9]*}}. End Error in Function: 'test_borrow_checked_cast_switch_enum_control_flow_incorrect'
@@ -631,18 +725,18 @@ bb0(%0 : @owned $Klass):
631
725
632
726
bb1(%1 : @owned $SuperKlass):
633
727
destroy_value %1 : $SuperKlass
634
- %none = enum $Optional <Klass>, #Optional .none!enumelt
635
- %borrownone = begin_borrow %none : $Optional <Klass>
636
- br bb3(%borrownone : $Optional <Klass>, %none : $Optional <Klass>)
728
+ %none = enum $FakeOptional <Klass>, #FakeOptional .none!enumelt
729
+ %borrownone = begin_borrow %none : $FakeOptional <Klass>
730
+ br bb3(%borrownone : $FakeOptional <Klass>, %none : $FakeOptional <Klass>)
637
731
638
732
bb2(%2 : @owned $Klass):
639
- %some = enum $Optional <Klass>, #Optional .some!enumelt, %2 : $Klass
640
- %borrowsome = begin_borrow %some : $Optional <Klass>
641
- br bb3(%borrowsome : $Optional <Klass>, %some : $Optional <Klass>)
733
+ %some = enum $FakeOptional <Klass>, #FakeOptional .some!enumelt, %2 : $Klass
734
+ %borrowsome = begin_borrow %some : $FakeOptional <Klass>
735
+ br bb3(%borrowsome : $FakeOptional <Klass>, %some : $FakeOptional <Klass>)
642
736
643
- bb3(%borrow : @guaranteed $Optional <Klass>, %mKlass : @owned $Optional <Klass>):
644
- destroy_value %mKlass : $Optional <Klass>
645
- end_borrow %borrow : $Optional <Klass>
737
+ bb3(%borrow : @guaranteed $FakeOptional <Klass>, %mKlass : @owned $FakeOptional <Klass>):
738
+ destroy_value %mKlass : $FakeOptional <Klass>
739
+ end_borrow %borrow : $FakeOptional <Klass>
646
740
%9999 = tuple()
647
741
return %9999 : $()
648
742
}
0 commit comments