| // Check that initialization of the only one memcpy-able struct member will not | |
| // be performed twice after successful non-trivial initializtion of the second | |
| // member. | |
| // | |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s | |
| int globId = 0; | |
| struct ImplicitCopy { | |
| int id; | |
| ImplicitCopy() { id = 10; } | |
| ~ImplicitCopy() { id = 20; } | |
| }; | |
| struct ExplicitCopy { | |
| int id; | |
| ExplicitCopy() { id = 15; } | |
| ExplicitCopy(const ExplicitCopy &x) { id = 25; } | |
| ~ExplicitCopy() { id = 35; } | |
| }; | |
| struct Container { | |
| ImplicitCopy o1; // memcpy-able member. | |
| ExplicitCopy o2; // non-trivial initialization. | |
| Container() { globId = 1000; } | |
| ~Container() { globId = 2000; } | |
| }; | |
| int main() { | |
| try { | |
| Container c1; | |
| // CHECK-DAG: call void @llvm.memcpy | |
| // CHECK-DAG: declare void @llvm.memcpy | |
| // CHECK-NOT: @llvm.memcpy | |
| Container c2(c1); | |
| return 2; | |
| } | |
| catch (...) { | |
| return 1; | |
| } | |
| return 0; | |
| } |