Skip to content

Commit f584b3a

Browse files
committed
[move-function] Add some tests that show we can handle a defer capturing multiple vars.
(cherry picked from commit b0bebcd)
1 parent 1d4302e commit f584b3a

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

test/SILOptimizer/move_function_kills_copyable_addressonly_vars.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,3 +631,40 @@ extension MiscTests {
631631
}
632632
}
633633

634+
//////////////////////////////////
635+
// Multiple Captures from Defer //
636+
//////////////////////////////////
637+
638+
func multipleCapture1<T : P>(_ k: T) -> () {
639+
let kType = type(of: k)
640+
var k2 = k
641+
var k3 = k
642+
let _ = _move(k2)
643+
let _ = _move(k3)
644+
var k4 = k
645+
k4 = k
646+
defer {
647+
k2 = kType.getP()
648+
print(k4)
649+
k3 = kType.getP()
650+
}
651+
print("foo bar")
652+
}
653+
654+
func multipleCapture2<T : P>(_ k: T) -> () {
655+
let kType = type(of: k)
656+
var k2 = k // expected-error {{'k2' used after being moved}}
657+
k2 = k
658+
var k3 = k
659+
let _ = _move(k2) // expected-note {{move here}}
660+
let _ = _move(k3)
661+
var k4 = k
662+
k4 = k
663+
defer {
664+
print(k2) // expected-note {{use here}}
665+
print(k4)
666+
k3 = kType.getP()
667+
}
668+
print("foo bar")
669+
}
670+

test/SILOptimizer/move_function_kills_copyable_loadable_vars.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,3 +674,39 @@ extension KlassWrapper {
674674
print("foo bar")
675675
}
676676
}
677+
678+
//////////////////////////////////
679+
// Multiple Captures from Defer //
680+
//////////////////////////////////
681+
682+
func multipleCapture1(_ k: Klass) -> () {
683+
var k2 = k
684+
var k3 = k
685+
let _ = _move(k2)
686+
let _ = _move(k3)
687+
var k4 = k
688+
k4 = k
689+
defer {
690+
k2 = Klass()
691+
print(k4)
692+
k3 = Klass()
693+
}
694+
print("foo bar")
695+
}
696+
697+
func multipleCapture2(_ k: Klass) -> () {
698+
var k2 = k // expected-error {{'k2' used after being moved}}
699+
k2 = k
700+
var k3 = k
701+
let _ = _move(k2) // expected-note {{move here}}
702+
let _ = _move(k3)
703+
var k4 = k
704+
k4 = k
705+
defer {
706+
print(k2) // expected-note {{use here}}
707+
print(k4)
708+
k3 = Klass()
709+
}
710+
print("foo bar")
711+
}
712+

0 commit comments

Comments
 (0)