Skip to content

Commit 02397c8

Browse files
committed
Add regression test for rust-lang#86106
Signed-off-by: Yuki Okushi <[email protected]>
1 parent 75f4ee8 commit 02397c8

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

src/test/codegen/issue-86106.rs

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// min-llvm-version: 15.0
2+
// compile-flags: -C opt-level=3 -C target-cpu=native
3+
4+
// The below two functions ensure that both `String::new()` and `"".to_string()`
5+
// produce the identical code.
6+
7+
#![crate_type = "lib"]
8+
9+
// CHECK-LABEL: @string_new = unnamed_addr alias void (ptr), ptr @empty_to_string
10+
// CHECK: define void @empty_to_string
11+
#[no_mangle]
12+
pub fn string_new() -> String {
13+
String::new()
14+
}
15+
16+
#[no_mangle]
17+
pub fn empty_to_string() -> String {
18+
// CHECK-NOT: load i8
19+
// CHECK: store i64
20+
// CHECK-NEXT: getelementptr
21+
// CHECK-NEXT: store ptr
22+
// CHECK-NEXT: getelementptr
23+
// CHECK-NOT: store i8
24+
// CHECK-NEXT: store i64
25+
// CHECK-NEXT: ret void
26+
"".to_string()
27+
}
28+
29+
// The below two functions ensure that both `vec![]` and `vec![].clone()`
30+
// produce the identical code.
31+
32+
// CHECK-LABEL: @empty_vec
33+
#[no_mangle]
34+
pub fn empty_vec() -> Vec<u8> {
35+
// CHECK: store i64
36+
// CHECK-NOT: load i8
37+
// CHECK-NEXT: getelementptr
38+
// CHECK-NEXT: store ptr
39+
// CHECK-NEXT: getelementptr
40+
// CHECK-NEXT: store i64
41+
// CHECK-NEXT: ret void
42+
vec![]
43+
}
44+
45+
// CHECK-LABEL: @empty_vec_clone
46+
#[no_mangle]
47+
pub fn empty_vec_clone() -> Vec<u8> {
48+
// CHECK: store i64
49+
// CHECK-NOT: load i8
50+
// CHECK-NEXT: getelementptr
51+
// CHECK-NEXT: store ptr
52+
// CHECK-NEXT: getelementptr
53+
// CHECK-NEXT: store i64
54+
// CHECK-NEXT: ret void
55+
vec![].clone()
56+
}

0 commit comments

Comments
 (0)