summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CodeGenCXX/nrvo-noopt.cpp58
-rw-r--r--clang/test/CodeGenCXX/nrvo.cpp51
-rw-r--r--clang/test/SemaCXX/nrvo-ast.cpp153
3 files changed, 7 insertions, 255 deletions
diff --git a/clang/test/CodeGenCXX/nrvo-noopt.cpp b/clang/test/CodeGenCXX/nrvo-noopt.cpp
deleted file mode 100644
index 46da7cd013b..00000000000
--- a/clang/test/CodeGenCXX/nrvo-noopt.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
-
-struct X {
- X();
- X(X&&);
-};
-
-// CHECK-LABEL: define void @_Z7test_00b
-X test_00(bool b) {
- if (b) {
- // CHECK-NOT: call void @_ZN1XC1EOS_
- // CHECK: call void @_ZN1XC1Ev
- // CHECK-NEXT: br label %return
- X x;
- return x;
- } else {
- // CHECK-NOT: call void @_ZN1XC1EOS_
- // CHECK: call void @_ZN1XC1Ev
- // CHECK-NEXT: br label %return
- X x;
- return x;
- }
-}
-
-// CHECK-LABEL: define void @_Z7test_01b
-X test_01(bool b) {
- if (b) {
- // CHECK-NOT: call void @_ZN1XC1EOS_
- // CHECK: call void @_ZN1XC1Ev
- // CHECK-NEXT: br label %return
- X x;
- return x;
- }
- // CHECK-NOT: call void @_ZN1XC1EOS_
- // CHECK: call void @_ZN1XC1Ev
- // CHECK-NEXT: br label %return
- X x;
- return x;
-}
-
-// CHECK-LABEL: define void @_Z7test_02b
-X test_02(bool b) {
- // CHECK: call void @_ZN1XC1Ev
- X x;
-
- if (b) {
- // CHECK-NOT: call void @_ZN1XC1EOS_
- // CHECK: call void @_ZN1XC1Ev
- // CHECK-NEXT: br label %return
- X y;
- return y;
- }
-
- // CHECK-NOT: call void @_ZN1XC1Ev
- // CHECK: call void @_ZN1XC1EOS_
- // CHECK-NEXT: br label %return
- return x;
-}
diff --git a/clang/test/CodeGenCXX/nrvo.cpp b/clang/test/CodeGenCXX/nrvo.cpp
index 1da4308e26b..0f359b9c900 100644
--- a/clang/test/CodeGenCXX/nrvo.cpp
+++ b/clang/test/CodeGenCXX/nrvo.cpp
@@ -130,13 +130,17 @@ X test2(bool B) {
}
// CHECK-LABEL: define void @_Z5test3b
-X test3(bool B, X x) {
+X test3(bool B) {
// CHECK: tail call {{.*}} @_ZN1XC1Ev
+ // CHECK-NOT: call {{.*}} @_ZN1XC1ERKS_
+ // CHECK: call {{.*}} @_ZN1XC1Ev
+ // CHECK: call {{.*}} @_ZN1XC1ERKS_
if (B) {
X y;
return y;
}
- // CHECK: tail call {{.*}} @_ZN1XC1ERKS_
+ // FIXME: we should NRVO this variable too.
+ X x;
return x;
}
@@ -187,13 +191,9 @@ X test6() {
}
// CHECK-LABEL: define void @_Z5test7b
-// CHECK-EH-LABEL: define void @_Z5test7b
X test7(bool b) {
// CHECK: tail call {{.*}} @_ZN1XC1Ev
// CHECK-NEXT: ret
-
- // CHECK-EH: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-EH-NEXT: ret
if (b) {
X x;
return x;
@@ -202,14 +202,10 @@ X test7(bool b) {
}
// CHECK-LABEL: define void @_Z5test8b
-// CHECK-EH-LABEL: define void @_Z5test8b
X test8(bool b) {
// CHECK: tail call {{.*}} @_ZN1XC1Ev
// CHECK-NEXT: ret
-
- // CHECK-EH: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-EH-NEXT: ret
-if (b) {
+ if (b) {
X x;
return x;
} else {
@@ -225,37 +221,4 @@ Y<int> test9() {
// CHECK-LABEL: define linkonce_odr void @_ZN1YIiE1fEv
// CHECK: tail call {{.*}} @_ZN1YIiEC1Ev
-// CHECK-LABEL: define void @_Z6test10b
-X test10(bool B, X x) {
- if (B) {
- // CHECK: tail call {{.*}} @_ZN1XC1ERKS_
- // CHECK-EH: tail call {{.*}} @_ZN1XC1ERKS_
- return x;
- }
- // CHECK: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-NOT: call {{.*}} @_ZN1XC1ERKS_
-
- // CHECK-EH: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-EH-NOT: call {{.*}} @_ZN1XC1ERKS_
- X y;
- return y;
-}
-
-// CHECK-LABEL: define {{.*}} void @_Z6test11I1XET_v
-// CHECK-EH-LABEL: define {{.*}} void @_Z6test11I1XET_v
-template <typename T>
-T test11() {
- // CHECK: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-NEXT: ret void
-
- // CHECK-EH: tail call {{.*}} @_ZN1XC1Ev
- // CHECK-EH-NEXT: ret void
- T t;
- return t;
-}
-
-void test12() {
- test11<X>();
-}
-
// CHECK-EH-03: attributes [[NR_NUW]] = { noreturn nounwind }
diff --git a/clang/test/SemaCXX/nrvo-ast.cpp b/clang/test/SemaCXX/nrvo-ast.cpp
deleted file mode 100644
index 63fac006e2e..00000000000
--- a/clang/test/SemaCXX/nrvo-ast.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-// 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);
-}
OpenPOWER on IntegriCloud