1 // 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 // 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 // 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 // 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 
6 // Reduced from PR12208
7 class X {
8 public:
9   X();
10   X(const X&);
11 #if __cplusplus >= 201103L
12   X(X&&);
13 #endif
14   ~X();
15 };
16 
17 // CHECK-LABEL: define void @_Z4Testv(
18 X Test()
19 {
20   X x;
21 
22   // Check that the copy constructor for X is called with result variable as
23   // sret argument.
24   // CHECK-CXX98: call void @_ZN1XC1ERKS_(
25   // CHECK-CXX11: call void @_ZN1XC1EOS_(
26   // CHECK-CXX98-ELIDE-NOT: call void @_ZN1XC1ERKS_(
27   // CHECK-CXX11-ELIDE-NOT: call void @_ZN1XC1EOS_(
28 
29   // Make sure that the destructor for X is called.
30   // FIXME: This call is present even in the -ELIDE runs, but is guarded by a
31   // branch that is never taken in those cases. We could generate better IR
32   // here.
33   // CHECK: call void @_ZN1XD1Ev(
34   return x;
35 }
36