Skip to content

Commit 900a2cc

Browse files
authored
Rollup merge of rust-lang#106036 - JohnTitor:issue-86106, r=nikic
Add regression test for rust-lang#86106 Closes rust-lang#86106 r? `@nikic` Signed-off-by: Yuki Okushi <[email protected]>
2 parents c9f4f03 + 3b16aea commit 900a2cc

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

src/test/codegen/issue-86106.rs

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

0 commit comments

Comments
 (0)