about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <jtitor@2k36.org>2022-12-22 20:18:30 +0900
committerYuki Okushi <jtitor@2k36.org>2023-01-07 18:58:07 +0900
commit75f1dfcc3236029bbd33799b94742424711e0376 (patch)
tree55f7d20f32b6cb8a4a6cf9e0874783367e099e44
parent472651aa104dea3e358da78c2548ab035cfaf434 (diff)
downloadrust-75f1dfcc3236029bbd33799b94742424711e0376.tar.gz
rust-75f1dfcc3236029bbd33799b94742424711e0376.zip
Add regression test for #86106
Signed-off-by: Yuki Okushi <jtitor@2k36.org>
-rw-r--r--src/test/codegen/issue-86106.rs56
1 files changed, 56 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..e81cab9f1df
--- /dev/null
+++ b/src/test/codegen/issue-86106.rs
@@ -0,0 +1,56 @@
+// min-llvm-version: 15.0
+// compile-flags: -C opt-level=3 -C target-cpu=native
+
+// The below two functions ensure that both `String::new()` and `"".to_string()`
+// produce the identical code.
+
+#![crate_type = "lib"]
+
+// CHECK-LABEL: @string_new = unnamed_addr alias void (ptr), ptr @empty_to_string
+// CHECK: define void @empty_to_string
+#[no_mangle]
+pub fn string_new() -> String {
+    String::new()
+}
+
+#[no_mangle]
+pub fn empty_to_string() -> String {
+    // CHECK-NOT: load i8
+    // CHECK: store i64
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store ptr
+    // CHECK-NEXT: getelementptr
+    // CHECK-NOT: store i8
+    // CHECK-NEXT: store i64
+    // 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 i64
+    // CHECK-NOT: load i8
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store ptr
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store i64
+    // CHECK-NEXT: ret void
+    vec![]
+}
+
+// CHECK-LABEL: @empty_vec_clone
+#[no_mangle]
+pub fn empty_vec_clone() -> Vec<u8> {
+    // CHECK: store i64
+    // CHECK-NOT: load i8
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store ptr
+    // CHECK-NEXT: getelementptr
+    // CHECK-NEXT: store i64
+    // CHECK-NEXT: ret void
+    vec![].clone()
+}