diff options
| author | bors <bors@rust-lang.org> | 2023-01-07 19:26:25 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-01-07 19:26:25 +0000 |
| commit | ee0412d1ef81efcfabe7f66cd21476ca85d618b1 (patch) | |
| tree | a4cbbfdf414219c9e55b885e50f5f0be021d454f /src | |
| parent | b1691f6413a4afd7529ab309965123cc63e82021 (diff) | |
| parent | ab9313e624d581a75f4b886c0adf351f848d725a (diff) | |
| download | rust-ee0412d1ef81efcfabe7f66cd21476ca85d618b1.tar.gz rust-ee0412d1ef81efcfabe7f66cd21476ca85d618b1.zip | |
Auto merge of #106036 - JohnTitor:issue-86106, r=nikic
Add regression test for #86106 Closes #86106 r? `@nikic` Signed-off-by: Yuki Okushi <jtitor@2k36.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/codegen/issue-86106.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/test/codegen/issue-86106.rs b/src/test/codegen/issue-86106.rs new file mode 100644 index 00000000000..9ccbcb24f56 --- /dev/null +++ b/src/test/codegen/issue-86106.rs @@ -0,0 +1,62 @@ +// min-llvm-version: 15.0 +// compile-flags: -C opt-level=3 -Z merge-functions=disabled + +// The below two functions ensure that both `String::new()` and `"".to_string()` +// produce the identical code. + +#![crate_type = "lib"] + +// CHECK-LABEL: define void @string_new +#[no_mangle] +pub fn string_new() -> String { + // CHECK-NOT: load i8 + // CHECK: store i{{32|64}} + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i{{32|64}} + // CHECK-NEXT: ret void + String::new() +} + +// CHECK-LABEL: define void @empty_to_string +#[no_mangle] +pub fn empty_to_string() -> String { + // CHECK-NOT: load i8 + // CHECK: store i{{32|64}} + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i{{32|64}} + // CHECK-NEXT: ret void + "".to_string() +} + +// The below two functions ensure that both `vec![]` and `vec![].clone()` +// produce the identical code. + +// CHECK-LABEL: @empty_vec +#[no_mangle] +pub fn empty_vec() -> Vec<u8> { + // CHECK: store i{{32|64}} + // CHECK-NOT: load i8 + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i{{32|64}} + // CHECK-NEXT: ret void + vec![] +} + +// CHECK-LABEL: @empty_vec_clone +#[no_mangle] +pub fn empty_vec_clone() -> Vec<u8> { + // CHECK: store i{{32|64}} + // CHECK-NOT: load i8 + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i{{32|64}} + // CHECK-NEXT: ret void + vec![].clone() +} |
