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
7class X {
8public:
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(
18X 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