Skip to content

Commit a0856ea

Browse files
committed
Add mir opt tests to be sure we generate copy, clones and moves when corresponds
1 parent 9f69c66 commit a0856ea

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

Diff for: tests/mir-opt/ergonomic-clones/closure.rs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#![crate_type = "lib"]
2+
#![feature(ergonomic_clones)]
3+
#![allow(incomplete_features)]
4+
5+
use std::clone::UseCloned;
6+
7+
pub fn ergonomic_clone_closure_move() -> String {
8+
// CHECK-LABEL: fn ergonomic_clone_closure_move(
9+
// CHECK: _0 = move (_1.0: std::string::String);
10+
// CHECK-NOT: <String as Clone>::clone
11+
let s = String::from("hi");
12+
13+
let cl = use || s;
14+
cl()
15+
}
16+
17+
#[derive(Clone)]
18+
struct Foo;
19+
20+
impl UseCloned for Foo {}
21+
22+
pub fn ergonomic_clone_closure_use_cloned() -> Foo {
23+
// CHECK-LABEL: fn ergonomic_clone_closure_use_cloned(
24+
// CHECK: <Foo as Clone>::clone
25+
let f = Foo;
26+
27+
let f1 = use || f;
28+
29+
let f2 = use || f;
30+
31+
f
32+
}
33+
34+
pub fn ergonomic_clone_closure_copy() -> i32 {
35+
// CHECK-LABEL: fn ergonomic_clone_closure_copy(
36+
// CHECK: _0 = copy ((*_1).0: i32);
37+
// CHECK-NOT: <i32 as Clone>::clone
38+
let i = 1;
39+
40+
let i1 = use || i;
41+
42+
let i2 = use || i;
43+
44+
i
45+
}
46+
47+
pub fn ergonomic_clone_closure_use_cloned_generics<T: UseCloned>(f: T) -> T {
48+
// CHECK-LABEL: fn ergonomic_clone_closure_use_cloned_generics(
49+
// CHECK: <T as Clone>::clone
50+
let f1 = use || f;
51+
52+
let f2 = use || f;
53+
54+
f
55+
}

0 commit comments

Comments
 (0)