temporaries.cpp revision 5132655e4296b780672e9a96b46a740135073534
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s 2struct A { 3 A(); 4 ~A(); 5 void f(); 6}; 7 8void f1() { 9 // CHECK: call void @_ZN1AC1Ev 10 // CHECK: call void @_ZN1AD1Ev 11 (void)A(); 12 13 // CHECK: call void @_ZN1AC1Ev 14 // CHECK: call void @_ZN1AD1Ev 15 A().f(); 16} 17 18// Function calls 19struct B { 20 B(); 21 ~B(); 22}; 23 24B g(); 25 26void f2() { 27 // CHECK-NOT: call void @_ZN1BC1Ev 28 // CHECK: call void @_ZN1BD1Ev 29 (void)g(); 30} 31 32// Member function calls 33struct C { 34 C(); 35 ~C(); 36 37 C f(); 38}; 39 40void f3() { 41 // CHECK: call void @_ZN1CC1Ev 42 // CHECK: call void @_ZN1CD1Ev 43 // CHECK: call void @_ZN1CD1Ev 44 C().f(); 45} 46 47// Function call operator 48struct D { 49 D(); 50 ~D(); 51 52 D operator()(); 53}; 54 55void f4() { 56 // CHECK: call void @_ZN1DC1Ev 57 // CHECK: call void @_ZN1DD1Ev 58 // CHECK: call void @_ZN1DD1Ev 59 D()(); 60} 61 62// Overloaded operators 63struct E { 64 E(); 65 ~E(); 66 E operator+(const E&); 67 E operator!(); 68}; 69 70void f5() { 71 // CHECK: call void @_ZN1EC1Ev 72 // CHECK: call void @_ZN1EC1Ev 73 // CHECK: call void @_ZN1ED1Ev 74 // CHECK: call void @_ZN1ED1Ev 75 // CHECK: call void @_ZN1ED1Ev 76 E() + E(); 77 78 // CHECK: call void @_ZN1EC1Ev 79 // CHECK: call void @_ZN1ED1Ev 80 // CHECK: call void @_ZN1ED1Ev 81 !E(); 82} 83 84struct F { 85 F(); 86 ~F(); 87 F& f(); 88}; 89 90void f6() { 91 // CHECK: call void @_ZN1FC1Ev 92 // CHECK: call void @_ZN1FD1Ev 93 F().f(); 94} 95 96struct G { 97 G(); 98 G(A); 99 ~G(); 100 operator A(); 101}; 102 103void a(const A&); 104 105void f7() { 106 // CHECK: call void @_ZN1AC1Ev 107 // CHECK: call void @_Z1aRK1A 108 // CHECK: call void @_ZN1AD1Ev 109 a(A()); 110 111 // CHECK: call void @_ZN1GC1Ev 112 // CHECK: call void @_ZN1Gcv1AEv 113 // CHECK: call void @_Z1aRK1A 114 // CHECK: call void @_ZN1AD1Ev 115 // CHECK: call void @_ZN1GD1Ev 116 a(G()); 117} 118 119namespace PR5077 { 120 121struct A { 122 A(); 123 ~A(); 124 int f(); 125}; 126 127void f(); 128int g(const A&); 129 130struct B { 131 int a1; 132 int a2; 133 B(); 134 ~B(); 135}; 136 137B::B() 138 // CHECK: call void @_ZN6PR50771AC1Ev 139 // CHECK: call i32 @_ZN6PR50771A1fEv 140 // CHECK: call void @_ZN6PR50771AD1Ev 141 : a1(A().f()) 142 // CHECK: call void @_ZN6PR50771AC1Ev 143 // CHECK: call i32 @_ZN6PR50771gERKNS_1AE 144 // CHECK: call void @_ZN6PR50771AD1Ev 145 , a2(g(A())) 146{ 147 // CHECK: call void @_ZN6PR50771fEv 148 f(); 149} 150 151struct C { 152 C(); 153 154 const B& b; 155}; 156 157C::C() 158 // CHECK: call void @_ZN6PR50771BC1Ev 159 : b(B()) { 160 // CHECK: call void @_ZN6PR50771fEv 161 f(); 162 163 // CHECK: call void @_ZN6PR50771BD1Ev 164} 165} 166 167A f8() { 168 // CHECK: call void @_ZN1AC1Ev 169 // CHECK-NOT: call void @_ZN1AD1Ev 170 return A(); 171 // CHECK: ret void 172} 173 174struct H { 175 H(); 176 ~H(); 177 H(const H&); 178}; 179 180void f9(H h) { 181 // CHECK: call void @_ZN1HC1Ev 182 // CHECK: call void @_Z2f91H 183 // CHECK: call void @_ZN1HD1Ev 184 f9(H()); 185 186 // CHECK: call void @_ZN1HC1ERKS_ 187 // CHECK: call void @_Z2f91H 188 // CHECK: call void @_ZN1HD1Ev 189 f9(h); 190} 191 192void f10(const H&); 193 194void f11(H h) { 195 // CHECK: call void @_ZN1HC1Ev 196 // CHECK: call void @_Z3f10RK1H 197 // CHECK: call void @_ZN1HD1Ev 198 f10(H()); 199 200 // CHECK: call void @_Z3f10RK1H 201 // CHECK-NOT: call void @_ZN1HD1Ev 202 // CHECK: ret void 203 f10(h); 204} 205 206// PR5808 207struct I { 208 I(const char *); 209 ~I(); 210}; 211 212// CHECK: _Z3f12v 213I f12() { 214 // CHECK: call void @_ZN1IC1EPKc 215 // CHECK-NOT: call void @_ZN1ID1Ev 216 // CHECK: ret void 217 return "Hello"; 218} 219 220// PR5867 221namespace PR5867 { 222 struct S { 223 S(); 224 S(const S &); 225 ~S(); 226 }; 227 228 void f(S, int); 229 // CHECK: define void @_ZN6PR58671gEv 230 void g() { 231 // CHECK: call void @_ZN6PR58671SC1Ev 232 // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi 233 // CHECK-NEXT: call void @_ZN6PR58671SD1Ev 234 // CHECK-NEXT: ret void 235 (f)(S(), 0); 236 } 237 238 // CHECK: define linkonce_odr void @_ZN6PR58672g2IiEEvT_ 239 template<typename T> 240 void g2(T) { 241 // CHECK: call void @_ZN6PR58671SC1Ev 242 // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi 243 // CHECK-NEXT: call void @_ZN6PR58671SD1Ev 244 // CHECK-NEXT: ret void 245 (f)(S(), 0); 246 } 247 248 void h() { 249 g2(17); 250 } 251} 252