1*67e74705SXin Li // Check that initialization of the only one memcpy-able struct member will not 2*67e74705SXin Li // be performed twice after successful non-trivial initializtion of the second 3*67e74705SXin Li // member. 4*67e74705SXin Li // 5*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s 6*67e74705SXin Li 7*67e74705SXin Li int globId = 0; 8*67e74705SXin Li 9*67e74705SXin Li struct ImplicitCopy { 10*67e74705SXin Li int id; 11*67e74705SXin Li ImplicitCopyImplicitCopy12*67e74705SXin Li ImplicitCopy() { id = 10; } ~ImplicitCopyImplicitCopy13*67e74705SXin Li ~ImplicitCopy() { id = 20; } 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li struct ExplicitCopy { 17*67e74705SXin Li int id; 18*67e74705SXin Li ExplicitCopyExplicitCopy19*67e74705SXin Li ExplicitCopy() { id = 15; } ExplicitCopyExplicitCopy20*67e74705SXin Li ExplicitCopy(const ExplicitCopy &x) { id = 25; } ~ExplicitCopyExplicitCopy21*67e74705SXin Li ~ExplicitCopy() { id = 35; } 22*67e74705SXin Li }; 23*67e74705SXin Li 24*67e74705SXin Li struct Container { 25*67e74705SXin Li ImplicitCopy o1; // memcpy-able member. 26*67e74705SXin Li ExplicitCopy o2; // non-trivial initialization. 27*67e74705SXin Li ContainerContainer28*67e74705SXin Li Container() { globId = 1000; } ~ContainerContainer29*67e74705SXin Li ~Container() { globId = 2000; } 30*67e74705SXin Li }; 31*67e74705SXin Li main()32*67e74705SXin Liint main() { 33*67e74705SXin Li try { 34*67e74705SXin Li Container c1; 35*67e74705SXin Li // CHECK-DAG: call void @llvm.memcpy 36*67e74705SXin Li // CHECK-DAG: declare void @llvm.memcpy 37*67e74705SXin Li // CHECK-NOT: @llvm.memcpy 38*67e74705SXin Li Container c2(c1); 39*67e74705SXin Li 40*67e74705SXin Li return 2; 41*67e74705SXin Li } 42*67e74705SXin Li catch (...) { 43*67e74705SXin Li return 1; 44*67e74705SXin Li } 45*67e74705SXin Li return 0; 46*67e74705SXin Li } 47