Skip to content

Commit 07cc495

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

File tree

1 file changed

+56
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)