Skip to content

Commit 5592732

Browse files
committed
Add codegen test to be sure we get rid of uneeded clones after monomorphization
1 parent ec67ce6 commit 5592732

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//@ compile-flags: -C no-prepopulate-passes -Copt-level=0 -Zmir-opt-level=0
2+
3+
#![feature(ergonomic_clones)]
4+
#![allow(incomplete_features)]
5+
6+
use std::clone::UseCloned;
7+
8+
fn ergonomic_clone_closure_move() -> String {
9+
let s = String::from("hi");
10+
11+
// CHECK-NOT: ; call core::clone::impls::<impl core::clone::Clone for String>::clone
12+
let cl = use || s;
13+
cl()
14+
}
15+
16+
#[derive(Debug)]
17+
struct Foo {
18+
a: i32,
19+
}
20+
21+
impl Clone for Foo {
22+
fn clone(&self) -> Self {
23+
Foo {
24+
a: self.a,
25+
}
26+
}
27+
}
28+
29+
impl UseCloned for Foo {}
30+
31+
fn ergonomic_clone_closure_use_cloned() -> Foo {
32+
let f = Foo { a: 1 };
33+
34+
// CHECK: ; call <closure::Foo as core::clone::Clone>::clone
35+
let f1 = use || f;
36+
37+
// CHECK: ; call <closure::Foo as core::clone::Clone>::clone
38+
let f2 = use || f;
39+
40+
f
41+
}
42+
43+
fn ergonomic_clone_closure_copy() -> i32 {
44+
let i = 1;
45+
46+
// CHECK-NOT: ; call core::clone::impls::<impl core::clone::Clone for i32>::clone
47+
let i1 = use || i;
48+
49+
// CHECK-NOT: ; call core::clone::impls::<impl core::clone::Clone for i32>::clone
50+
let i2 = use || i;
51+
52+
i
53+
}
54+
55+
fn ergonomic_clone_closure_use_cloned_generics<T: UseCloned>(f: T) -> T {
56+
// CHECK-NOT: ; call core::clone::impls::<impl core::clone::Clone for i32>::clone
57+
let f1 = use || f;
58+
59+
// CHECK-NOT: ; call core::clone::impls::<impl core::clone::Clone for i32>::clone
60+
let f2 = use || f;
61+
62+
f
63+
}
64+
65+
fn main() {
66+
let a = ergonomic_clone_closure_move();
67+
let b = ergonomic_clone_closure_use_cloned();
68+
let c = ergonomic_clone_closure_copy();
69+
let d = ergonomic_clone_closure_use_cloned_generics(22);
70+
println!("{:?} {:?} {:?} {:?}", a, b, c, d);
71+
}

0 commit comments

Comments
 (0)