| // 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; |
| } |