blob: 63fac006e2e3459768c6f6bb5155f71e3cecd720 [file] [log] [blame]
// RUN: %clang_cc1 -fcxx-exceptions -fsyntax-only -ast-dump -o - %s | FileCheck %s
struct X {
X();
X(const X&);
X(X&&);
};
// CHECK-LABEL: FunctionDecl {{.*}} test_00
X test_00() {
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
return x;
}
// CHECK-LABEL: FunctionDecl {{.*}} test_01
X test_01(bool b) {
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
if (b)
return x;
return x;
}
// CHECK-LABEL: FunctionDecl {{.*}} test_02
X test_02(bool b) {
// CHECK-NOT: VarDecl {{.*}} x {{.*}} nrvo
X x;
// CHECK-NOT: VarDecl {{.*}} y {{.*}} nrvo
X y;
if (b)
return y;
return x;
}
// CHECK-LABEL: FunctionDecl {{.*}} test_03
X test_03(bool b) {
if (b) {
// CHECK: VarDecl {{.*}} y {{.*}} nrvo
X y;
return y;
}
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
return x;
}
extern "C" _Noreturn void exit(int) throw();
// CHECK-LABEL: FunctionDecl {{.*}} test_04
X test_04(bool b) {
{
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
if (b)
return x;
}
exit(1);
}
void may_throw();
// CHECK-LABEL: FunctionDecl {{.*}} test_05
X test_05() {
try {
may_throw();
return X();
} catch (X x) {
// CHECK-NOT: VarDecl {{.*}} x {{.*}} nrvo
return x;
}
}
// CHECK-LABEL: FunctionDecl {{.*}} test_06
X test_06() {
// CHECK-NOT: VarDecl {{.*}} x {{.*}} nrvo
X x __attribute__((aligned(8)));
return x;
}
// CHECK-LABEL: FunctionDecl {{.*}} test_07
X test_07(bool b) {
if (b) {
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
return x;
}
return X();
}
// CHECK-LABEL: FunctionDecl {{.*}} test_08
X test_08(bool b) {
if (b) {
// CHECK: VarDecl {{.*}} x {{.*}} nrvo
X x;
return x;
} else {
// CHECK: VarDecl {{.*}} y {{.*}} nrvo
X y;
return y;
}
}
template <typename T>
struct Y {
Y();
// CHECK-LABEL: CXXMethodDecl {{.*}} test_09 'Y<T> ()'
// CHECK: VarDecl {{.*}} y 'Y<T>' nrvo
// CHECK-LABEL: CXXMethodDecl {{.*}} test_09 'Y<int> ()'
// CHECK: VarDecl {{.*}} y 'Y<int>' nrvo
static Y test_09() {
Y y;
return y;
}
};
struct Z {
Z(const X&);
};
// CHECK-LABEL: FunctionDecl {{.*}} test_10 'A ()'
// CHECK: VarDecl {{.*}} b 'B' nrvo
// CHECK-LABEL: FunctionDecl {{.*}} test_10 'X ()'
// CHECK: VarDecl {{.*}} b {{.*}} nrvo
// CHECK-LABEL: FunctionDecl {{.*}} test_10 'Z ()'
// CHECK-NOT: VarDecl {{.*}} b {{.*}} nrvo
template <typename A, typename B>
A test_10() {
B b;
return b;
}
// CHECK-LABEL: FunctionDecl {{.*}} test_11 'A (bool)'
// CHECK-NOT: VarDecl {{.*}} a {{.*}} nrvo
// CHECK-LABEL: FunctionDecl {{.*}} test_11 'X (bool)'
// CHECK-NOT: VarDecl {{.*}} a {{.*}} nrvo
template <typename A>
A test_11(bool b) {
A a;
if (b)
return A();
return a;
}
void instantiate() {
Y<int>::test_09();
test_10<X, X>();
test_10<Z, X>();
test_11<X>(true);
}