1*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 -triple i386-unknown-unknown -fno-elide-constructors -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX98 2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown -fno-elide-constructors -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX11 3*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX98-ELIDE 4*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CXX11-ELIDE 5*67e74705SXin Li 6*67e74705SXin Li // Reduced from PR12208 7*67e74705SXin Li class X { 8*67e74705SXin Li public: 9*67e74705SXin Li X(); 10*67e74705SXin Li X(const X&); 11*67e74705SXin Li #if __cplusplus >= 201103L 12*67e74705SXin Li X(X&&); 13*67e74705SXin Li #endif 14*67e74705SXin Li ~X(); 15*67e74705SXin Li }; 16*67e74705SXin Li 17*67e74705SXin Li // CHECK-LABEL: define void @_Z4Testv( Test()18*67e74705SXin LiX Test() 19*67e74705SXin Li { 20*67e74705SXin Li X x; 21*67e74705SXin Li 22*67e74705SXin Li // Check that the copy constructor for X is called with result variable as 23*67e74705SXin Li // sret argument. 24*67e74705SXin Li // CHECK-CXX98: call void @_ZN1XC1ERKS_( 25*67e74705SXin Li // CHECK-CXX11: call void @_ZN1XC1EOS_( 26*67e74705SXin Li // CHECK-CXX98-ELIDE-NOT: call void @_ZN1XC1ERKS_( 27*67e74705SXin Li // CHECK-CXX11-ELIDE-NOT: call void @_ZN1XC1EOS_( 28*67e74705SXin Li 29*67e74705SXin Li // Make sure that the destructor for X is called. 30*67e74705SXin Li // FIXME: This call is present even in the -ELIDE runs, but is guarded by a 31*67e74705SXin Li // branch that is never taken in those cases. We could generate better IR 32*67e74705SXin Li // here. 33*67e74705SXin Li // CHECK: call void @_ZN1XD1Ev( 34*67e74705SXin Li return x; 35*67e74705SXin Li } 36