1*67e74705SXin Li // Check that in case of copying an array of memcpy-able objects, their 2*67e74705SXin Li // destructors will be called if an exception is thrown. 3*67e74705SXin Li // 4*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fexceptions -fcxx-exceptions -O0 -fno-elide-constructors -emit-llvm %s -o - | FileCheck %s 5*67e74705SXin Li 6*67e74705SXin Li struct ImplicitCopy { 7*67e74705SXin Li int x; ImplicitCopyImplicitCopy8*67e74705SXin Li ImplicitCopy() { x = 10; } ~ImplicitCopyImplicitCopy9*67e74705SXin Li ~ImplicitCopy() { x = 20; } 10*67e74705SXin Li }; 11*67e74705SXin Li 12*67e74705SXin Li struct ThrowCopy { ThrowCopyThrowCopy13*67e74705SXin Li ThrowCopy() {} ThrowCopyThrowCopy14*67e74705SXin Li ThrowCopy(const ThrowCopy &) { throw 1; } 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li struct Container { 18*67e74705SXin Li ImplicitCopy b[2]; 19*67e74705SXin Li ThrowCopy c; 20*67e74705SXin Li }; 21*67e74705SXin Li main()22*67e74705SXin Liint main () { 23*67e74705SXin Li try { 24*67e74705SXin Li Container c1; 25*67e74705SXin Li // CHECK_LABEL: main 26*67e74705SXin Li // CHECK-NOT: call void @_ZN9ThrowCopyC1ERKS_ 27*67e74705SXin Li // CHECK: invoke void @_ZN9ThrowCopyC1ERKS_ 28*67e74705SXin Li // CHECK: invoke void @_ZN12ImplicitCopyD1Ev 29*67e74705SXin Li Container c2(c1); 30*67e74705SXin Li } 31*67e74705SXin Li catch (...) { 32*67e74705SXin Li return 1; 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li return 0; 36*67e74705SXin Li } 37*67e74705SXin Li 38