Skip to content

Commit 3deb5d4

Browse files
Merge pull request #72328 from nate-chandler/test/20240314/1
[Test] NoncopyablePartialConsumption: Added another execution test.
2 parents c3bc3d3 + 2f83828 commit 3deb5d4

File tree

2 files changed

+160
-47
lines changed

2 files changed

+160
-47
lines changed

test/Interpreter/move_expr_moveonly_partial_consumption.swift

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,105 +4,103 @@
44
// REQUIRES: executable_test
55

66
@main struct App { static func main() {
7-
test1((1,2,3,4))
7+
test1()
88
}}
99

1010
func barrier() { print("barrier") }
1111

12-
struct Ur<T> : ~Copyable {
13-
var t: T
12+
struct Ur : ~Copyable {
1413
var name: String
15-
init(_ t: T, named name: String) {
16-
self.t = t
14+
init(named name: String) {
1715
self.name = name
1816
print("hi", name)
1917
}
2018
deinit {
2119
print("bye", name)
2220
}
2321
}
24-
func take<T>(_ u: consuming Ur<T>) {}
22+
func take(_ u: consuming Ur) {}
2523

26-
struct Pair<T> : ~Copyable {
27-
var u1: Ur<T>
28-
var u2: Ur<T>
29-
init(_ t1: T, _ t2: T, named name: String) {
30-
u1 = .init(t1, named: "\(name).u1")
31-
u2 = .init(t2, named: "\(name).u2")
24+
struct Pair : ~Copyable {
25+
var u1: Ur
26+
var u2: Ur
27+
init(named name: String) {
28+
u1 = .init(named: "\(name).u1")
29+
u2 = .init(named: "\(name).u2")
3230
}
3331
}
34-
func take<T>(_ u: consuming Pair<T>) {}
32+
func take(_ u: consuming Pair) {}
3533

36-
struct Quad<T> : ~Copyable {
37-
var p1: Pair<T>
38-
var p2: Pair<T>
39-
init(_ t1: T, _ t2: T, _ t3: T, _ t4: T, named name: String) {
40-
p1 = .init(t1, t2, named: "\(name).p1")
41-
p2 = .init(t3, t4, named: "\(name).p2")
34+
struct Quad : ~Copyable {
35+
var p1: Pair
36+
var p2: Pair
37+
init(named name: String) {
38+
p1 = .init(named: "\(name).p1")
39+
p2 = .init(named: "\(name).p2")
4240
}
4341
}
44-
func take<T>(_ u: consuming Quad<T>) {}
42+
func take(_ u: consuming Quad) {}
4543

46-
func test1<T>(_ ts: (T, T, T, T)) {
44+
func test1() {
4745
do {
48-
let q1 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q1")
46+
let q1 = Quad(named: "\(#function).q1")
4947
barrier()
5048
// CHECK: barrier
51-
// CHECK: bye test1(_:).q1.p1.u1
52-
// CHECK: bye test1(_:).q1.p1.u2
53-
// CHECK: bye test1(_:).q1.p2.u1
54-
// CHECK: bye test1(_:).q1.p2.u2
49+
// CHECK: bye test1().q1.p1.u1
50+
// CHECK: bye test1().q1.p1.u2
51+
// CHECK: bye test1().q1.p2.u1
52+
// CHECK: bye test1().q1.p2.u2
5553
}
5654

57-
let q2 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q2")
55+
let q2 = Quad(named: "\(#function).q2")
5856
take(q2.p2.u2)
5957
take(q2.p2.u1)
6058
barrier()
6159
take(q2.p1.u2)
6260
take(q2.p1.u1)
63-
// CHECK: bye test1(_:).q2.p2.u2
64-
// CHECK: bye test1(_:).q2.p2.u1
61+
// CHECK: bye test1().q2.p2.u2
62+
// CHECK: bye test1().q2.p2.u1
6563
// CHECK: barrier
66-
// CHECK: bye test1(_:).q2.p1.u2
67-
// CHECK: bye test1(_:).q2.p1.u1
64+
// CHECK: bye test1().q2.p1.u2
65+
// CHECK: bye test1().q2.p1.u1
6866

69-
let q3 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q3")
67+
let q3 = Quad(named: "\(#function).q3")
7068
_ = consume q3.p2.u2
7169
_ = consume q3.p2.u1
7270
_ = consume q3.p1.u2
7371
barrier()
7472
_ = consume q3.p1.u1
75-
// CHECK: bye test1(_:).q3.p2.u2
76-
// CHECK: bye test1(_:).q3.p2.u1
77-
// CHECK: bye test1(_:).q3.p1.u2
73+
// CHECK: bye test1().q3.p2.u2
74+
// CHECK: bye test1().q3.p2.u1
75+
// CHECK: bye test1().q3.p1.u2
7876
// CHECK: barrier
79-
// CHECK: bye test1(_:).q3.p1.u1
77+
// CHECK: bye test1().q3.p1.u1
8078

81-
let q4 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q4")
79+
let q4 = Quad(named: "\(#function).q4")
8280
_ = consume q4.p1.u1
8381
barrier()
8482
_ = consume q4.p2.u1
8583
_ = consume q4.p1.u2
8684
_ = consume q4.p2.u2
87-
// CHECK: bye test1(_:).q4.p1.u1
85+
// CHECK: bye test1().q4.p1.u1
8886
// CHECK: barrier
89-
// CHECK: bye test1(_:).q4.p2.u1
90-
// CHECK: bye test1(_:).q4.p1.u2
91-
// CHECK: bye test1(_:).q4.p2.u2
87+
// CHECK: bye test1().q4.p2.u1
88+
// CHECK: bye test1().q4.p1.u2
89+
// CHECK: bye test1().q4.p2.u2
9290

9391
do {
94-
let q5 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q5")
92+
let q5 = Quad(named: "\(#function).q5")
9593
take(q5.p1.u1)
9694
_ = consume q5.p2.u1
9795
_ = consume q5.p1.u2
9896
take(q5.p2.u2)
99-
// CHECK: bye test1(_:).q5.p1.u1
100-
// CHECK: bye test1(_:).q5.p2.u1
101-
// CHECK: bye test1(_:).q5.p1.u2
102-
// CHECK: bye test1(_:).q5.p2.u2
97+
// CHECK: bye test1().q5.p1.u1
98+
// CHECK: bye test1().q5.p2.u1
99+
// CHECK: bye test1().q5.p1.u2
100+
// CHECK: bye test1().q5.p2.u2
103101
}
104102
do {
105-
let q6 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q6")
103+
let q6 = Quad(named: "\(#function).q6")
106104
if Bool.random() {
107105
take(q6.p1.u1)
108106
_ = consume q6.p2.u1
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
// RUN: %target-run-simple-swift(-parse-as-library -Xfrontend -sil-verify-all -enable-experimental-feature MoveOnlyPartialConsumption) | %FileCheck %s
2+
// RUN: %target-run-simple-swift(-parse-as-library -O -Xfrontend -sil-verify-all -enable-experimental-feature MoveOnlyPartialConsumption) | %FileCheck %s
3+
4+
// REQUIRES: executable_test
5+
6+
@main struct App { static func main() {
7+
test1((1,2,3,4))
8+
}}
9+
10+
func barrier() { print("barrier") }
11+
12+
struct Ur<T> : ~Copyable {
13+
var t: T
14+
var name: String
15+
init(_ t: T, named name: String) {
16+
self.t = t
17+
self.name = name
18+
print("hi", name)
19+
}
20+
deinit {
21+
print("bye", name)
22+
}
23+
}
24+
func take<T>(_ u: consuming Ur<T>) {}
25+
26+
struct Pair<T> : ~Copyable {
27+
var u1: Ur<T>
28+
var u2: Ur<T>
29+
init(_ t1: T, _ t2: T, named name: String) {
30+
u1 = .init(t1, named: "\(name).u1")
31+
u2 = .init(t2, named: "\(name).u2")
32+
}
33+
}
34+
func take<T>(_ u: consuming Pair<T>) {}
35+
36+
struct Quad<T> : ~Copyable {
37+
var p1: Pair<T>
38+
var p2: Pair<T>
39+
init(_ t1: T, _ t2: T, _ t3: T, _ t4: T, named name: String) {
40+
p1 = .init(t1, t2, named: "\(name).p1")
41+
p2 = .init(t3, t4, named: "\(name).p2")
42+
}
43+
}
44+
func take<T>(_ u: consuming Quad<T>) {}
45+
46+
func test1<T>(_ ts: (T, T, T, T)) {
47+
do {
48+
let q1 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q1")
49+
barrier()
50+
// CHECK: barrier
51+
// CHECK: bye test1(_:).q1.p1.u1
52+
// CHECK: bye test1(_:).q1.p1.u2
53+
// CHECK: bye test1(_:).q1.p2.u1
54+
// CHECK: bye test1(_:).q1.p2.u2
55+
}
56+
57+
let q2 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q2")
58+
take(q2.p2.u2)
59+
take(q2.p2.u1)
60+
barrier()
61+
take(q2.p1.u2)
62+
take(q2.p1.u1)
63+
// CHECK: bye test1(_:).q2.p2.u2
64+
// CHECK: bye test1(_:).q2.p2.u1
65+
// CHECK: barrier
66+
// CHECK: bye test1(_:).q2.p1.u2
67+
// CHECK: bye test1(_:).q2.p1.u1
68+
69+
let q3 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q3")
70+
_ = consume q3.p2.u2
71+
_ = consume q3.p2.u1
72+
_ = consume q3.p1.u2
73+
barrier()
74+
_ = consume q3.p1.u1
75+
// CHECK: bye test1(_:).q3.p2.u2
76+
// CHECK: bye test1(_:).q3.p2.u1
77+
// CHECK: bye test1(_:).q3.p1.u2
78+
// CHECK: barrier
79+
// CHECK: bye test1(_:).q3.p1.u1
80+
81+
let q4 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q4")
82+
_ = consume q4.p1.u1
83+
barrier()
84+
_ = consume q4.p2.u1
85+
_ = consume q4.p1.u2
86+
_ = consume q4.p2.u2
87+
// CHECK: bye test1(_:).q4.p1.u1
88+
// CHECK: barrier
89+
// CHECK: bye test1(_:).q4.p2.u1
90+
// CHECK: bye test1(_:).q4.p1.u2
91+
// CHECK: bye test1(_:).q4.p2.u2
92+
93+
do {
94+
let q5 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q5")
95+
take(q5.p1.u1)
96+
_ = consume q5.p2.u1
97+
_ = consume q5.p1.u2
98+
take(q5.p2.u2)
99+
// CHECK: bye test1(_:).q5.p1.u1
100+
// CHECK: bye test1(_:).q5.p2.u1
101+
// CHECK: bye test1(_:).q5.p1.u2
102+
// CHECK: bye test1(_:).q5.p2.u2
103+
}
104+
do {
105+
let q6 = Quad<T>(ts.0, ts.1, ts.2, ts.3, named: "\(#function).q6")
106+
if Bool.random() {
107+
take(q6.p1.u1)
108+
_ = consume q6.p2.u1
109+
} else {
110+
_ = consume q6.p1.u2
111+
take(q6.p2.u2)
112+
}
113+
}
114+
}
115+

0 commit comments

Comments
 (0)