nrvo.cpp revision 72bf425fab902f5fd6114b630b8dc3dc0e1de1a8
1// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
2// RUN: %clang_cc1 -emit-llvm -fexceptions -o - %s | FileCheck --check-prefix=CHECK-EH %s
3
4// Test code generation for the named return value optimization.
5class X {
6public:
7  X();
8  X(const X&);
9  ~X();
10};
11
12// CHECK: define void @_Z5test0v
13// CHECK-EH: define void @_Z5test0v
14X test0() {
15  X x;
16  // CHECK-NOT: call void @_ZN1XD1Ev
17  // CHECK: ret void
18  // CHECK-EH: ret void
19  return x;
20  // CHECK-EH: invoke void @_ZN1XD1Ev
21}
22
23// CHECK: define void @_Z5test1b(
24X test1(bool B) {
25  // CHECK: call void @_ZN1XC1Ev
26  X x;
27  // CHECK-NOT: call void @_ZN1XD1Ev
28  // CHECK: ret void
29  if (B)
30    return (x);
31  return x;
32  // CHECK-EH: invoke void @_ZN1XD1Ev
33}
34
35// CHECK: define void @_Z5test2b
36// CHECK-EH: define void @_Z5test2b
37X test2(bool B) {
38  // No NRVO
39  // CHECK: call void @_ZN1XC1Ev
40  X x;
41  // CHECK: call void @_ZN1XC1Ev
42  X y;
43  // CHECK: call void @_ZN1XC1ERKS_
44  // CHECK-EH: invoke void @_ZN1XC1ERKS_
45  if (B)
46    return y;
47  // CHECK: call void @_ZN1XC1ERKS_
48  // CHECK-EH: invoke void @_ZN1XC1ERKS_
49  return x;
50  // CHECK: call void @_ZN1XD1Ev
51  // CHECK: call void @_ZN1XD1Ev
52  // CHECK: ret void
53  // CHECK-EH: invoke void @_ZN1XD1Ev
54  // CHECK-EH: invoke void @_ZN1XD1Ev
55}
56
57X test3(bool B) {
58  // FIXME: We don't manage to apply NRVO here, although we could.
59  {
60    X y;
61    return y;
62  }
63  X x;
64  return x;
65}
66