| //@ revisions: DEBUGINFO NODEBUGINFO | |
| //@ compile-flags: -Copt-level=3 -Cno-prepopulate-passes | |
| //@ [DEBUGINFO] compile-flags: -Cdebuginfo=full | |
| // From https://github.com/rust-lang/rust/issues/128081. | |
| // Ensure that we only generate a memcpy instruction. | |
| #![crate_type = "lib"] | |
| #[derive(Clone)] | |
| struct SubCloneAndCopy { | |
| v1: u32, | |
| v2: u32, | |
| } | |
| #[derive(Clone)] | |
| struct CloneOnly { | |
| v1: u8, | |
| v2: u8, | |
| v3: u8, | |
| v4: u8, | |
| v5: u8, | |
| v6: u8, | |
| v7: u8, | |
| v8: u8, | |
| v9: u8, | |
| v_sub: SubCloneAndCopy, | |
| v_large: [u8; 256], | |
| } | |
| // CHECK-LABEL: define {{.*}}@clone_only( | |
| #[no_mangle] | |
| pub fn clone_only(v: &CloneOnly) -> CloneOnly { | |
| // CHECK-NOT: call {{.*}}clone | |
| // CHECK-NOT: store i8 | |
| // CHECK-NOT: store i32 | |
| // CHECK: call void @llvm.memcpy | |
| // CHECK-NEXT: ret void | |
| v.clone() | |
| } |