]> git.lizzy.rs Git - rust.git/blob - tests/codegen/issue-86106.rs
Move /src/test to /tests
[rust.git] / tests / codegen / issue-86106.rs
1 // min-llvm-version: 15.0
2 // compile-flags: -C opt-level=3 -Z merge-functions=disabled
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: define void @string_new
10 #[no_mangle]
11 pub fn string_new() -> String {
12     // CHECK-NOT: load i8
13     // CHECK: store i{{32|64}}
14     // CHECK-NEXT: getelementptr
15     // CHECK-NEXT: store ptr
16     // CHECK-NEXT: getelementptr
17     // CHECK-NEXT: store i{{32|64}}
18     // CHECK-NEXT: ret void
19     String::new()
20 }
21
22 // CHECK-LABEL: define void @empty_to_string
23 #[no_mangle]
24 pub fn empty_to_string() -> String {
25     // CHECK-NOT: load i8
26     // CHECK: store i{{32|64}}
27     // CHECK-NEXT: getelementptr
28     // CHECK-NEXT: store ptr
29     // CHECK-NEXT: getelementptr
30     // CHECK-NEXT: store i{{32|64}}
31     // CHECK-NEXT: ret void
32     "".to_string()
33 }
34
35 // The below two functions ensure that both `vec![]` and `vec![].clone()`
36 // produce the identical code.
37
38 // CHECK-LABEL: @empty_vec
39 #[no_mangle]
40 pub fn empty_vec() -> Vec<u8> {
41     // CHECK: store i{{32|64}}
42     // CHECK-NOT: load i8
43     // CHECK-NEXT: getelementptr
44     // CHECK-NEXT: store ptr
45     // CHECK-NEXT: getelementptr
46     // CHECK-NEXT: store i{{32|64}}
47     // CHECK-NEXT: ret void
48     vec![]
49 }
50
51 // CHECK-LABEL: @empty_vec_clone
52 #[no_mangle]
53 pub fn empty_vec_clone() -> Vec<u8> {
54     // CHECK: store i{{32|64}}
55     // CHECK-NOT: load i8
56     // CHECK-NEXT: getelementptr
57     // CHECK-NEXT: store ptr
58     // CHECK-NEXT: getelementptr
59     // CHECK-NEXT: store i{{32|64}}
60     // CHECK-NEXT: ret void
61     vec![].clone()
62 }