85 lines
1.7 KiB
C++
85 lines
1.7 KiB
C++
|
// RUN: %clang_cc1 -emit-llvm -O1 -o - %s | FileCheck %s
|
||
|
// RUN: %clang_cc1 -emit-llvm -fexceptions -o - %s | FileCheck --check-prefix=CHECK-EH %s
|
||
|
|
||
|
// Test code generation for the named return value optimization.
|
||
|
class X {
|
||
|
public:
|
||
|
X();
|
||
|
X(const X&);
|
||
|
~X();
|
||
|
};
|
||
|
|
||
|
// CHECK: define void @_Z5test0v
|
||
|
// CHECK-EH: define void @_Z5test0v
|
||
|
X test0() {
|
||
|
X x;
|
||
|
// CHECK-NOT: call void @_ZN1XD1Ev
|
||
|
// CHECK: ret void
|
||
|
// CHECK-EH: br label
|
||
|
// CHECK-EH: call void @_ZN1XD1Ev
|
||
|
// CHECK-EH: br label
|
||
|
// CHECK-EH: invoke void @_ZN1XD1Ev
|
||
|
// CHECK-EH: ret void
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
// CHECK: define void @_Z5test1b(
|
||
|
X test1(bool B) {
|
||
|
// CHECK: call void @_ZN1XC1Ev
|
||
|
X x;
|
||
|
// CHECK-NOT: call void @_ZN1XD1Ev
|
||
|
// CHECK: ret void
|
||
|
if (B)
|
||
|
return (x);
|
||
|
return x;
|
||
|
// CHECK-EH: invoke void @_ZN1XD1Ev
|
||
|
}
|
||
|
|
||
|
// CHECK: define void @_Z5test2b
|
||
|
// CHECK-EH: define void @_Z5test2b
|
||
|
X test2(bool B) {
|
||
|
// No NRVO
|
||
|
// CHECK: call void @_ZN1XC1Ev
|
||
|
X x;
|
||
|
// CHECK: call void @_ZN1XC1Ev
|
||
|
X y;
|
||
|
// CHECK: call void @_ZN1XC1ERKS_
|
||
|
// CHECK-EH: invoke void @_ZN1XC1ERKS_
|
||
|
if (B)
|
||
|
return y;
|
||
|
// CHECK: call void @_ZN1XC1ERKS_
|
||
|
// CHECK-EH: invoke void @_ZN1XC1ERKS_
|
||
|
return x;
|
||
|
// CHECK: call void @_ZN1XD1Ev
|
||
|
// CHECK: call void @_ZN1XD1Ev
|
||
|
// CHECK: ret void
|
||
|
// CHECK-EH: invoke void @_ZN1XD1Ev
|
||
|
// CHECK-EH: invoke void @_ZN1XD1Ev
|
||
|
}
|
||
|
|
||
|
X test3(bool B) {
|
||
|
// FIXME: We don't manage to apply NRVO here, although we could.
|
||
|
{
|
||
|
X y;
|
||
|
return y;
|
||
|
}
|
||
|
X x;
|
||
|
return x;
|
||
|
}
|
||
|
|
||
|
extern "C" void exit(int) throw();
|
||
|
|
||
|
// CHECK: define void @_Z5test4b
|
||
|
X test4(bool B) {
|
||
|
{
|
||
|
// CHECK: tail call void @_ZN1XC1Ev
|
||
|
X x;
|
||
|
// CHECK: br i1
|
||
|
if (B)
|
||
|
return x;
|
||
|
}
|
||
|
// CHECK: tail call void @_ZN1XD1Ev
|
||
|
// CHECK: tail call void @exit(i32 1)
|
||
|
exit(1);
|
||
|
}
|