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