1// RUN: %clang_cc1 -w -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - | FileCheck %s 2// RUN: %clang_cc1 -w -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s 3 4// XFAIL: win32 5 6int &src(); 7int *sink(); 8extern "C" __complex float complex_src(); 9extern "C" __complex float *complex_sink(); 10 11// CHECK-LABEL: define 12void f1() { 13 *sink() 14 // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] 15#line 100 16 = // 17 src(); 18} 19 20struct foo { 21 int i; 22 int &j; 23 __complex float k; 24 foo(); 25}; 26 27// CHECK-LABEL: define 28foo::foo() 29 : 30#line 200 31 i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]] 32 (src()), 33 j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]] 34 (src()), 35 k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]] 36 (complex_src()) { 37} 38 39// CHECK-LABEL: define {{.*}}f2{{.*}} 40void f2() { 41 // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]] 42 *complex_sink() 43#line 300 44 = // 45 complex_src(); 46} 47 48// CHECK-LABEL: define 49void f3() { 50 // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]] 51 *complex_sink() 52#line 400 53 += // 54 complex_src(); 55} 56 57// CHECK-LABEL: define 58void f4() { 59#line 500 60 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] 61 = src(); 62} 63 64// CHECK-LABEL: define 65void f5() { 66#line 600 67 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]] 68 = complex_src(); 69} 70 71struct agg { int i; }; 72agg agg_src(); 73 74// CHECK-LABEL: define 75void f6() { 76 agg x; 77 // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]] 78 x 79#line 700 80 = // 81 agg_src(); 82} 83 84// CHECK-LABEL: define 85void f7() { 86 int *src1(); 87 int src2(); 88#line 800 89 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]] 90 src1())[src2()]; 91} 92 93// CHECK-LABEL: define 94void f8() { 95 int src1[1]; 96 int src2(); 97#line 900 98 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]] 99 src1)[src2()]; 100} 101 102// CHECK-LABEL: define 103void f9(int i) { 104 int src1[1][i]; 105 int src2(); 106#line 1000 107 auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]] 108 src1)[src2()]; 109} 110 111inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; } 112 113// CHECK-LABEL: define 114void f10() { 115 void *void_src(); 116 ( 117 // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]] 118#line 1100 119 new (void_src()) int(src())); 120} 121 122// noexcept just to simplify the codegen a bit 123void fn() noexcept(true); 124 125struct bar { 126 bar(); 127 // noexcept(false) to convolute the global dtor 128 ~bar() noexcept(false); 129}; 130// global ctor cleanup 131// CHECK-LABEL: define 132// CHECK: invoke{{ }} 133// CHECK: invoke{{ }} 134// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]] 135 136// terminate caller 137// CHECK-LABEL: define 138 139// global dtor cleanup 140// CHECK-LABEL: define 141// CHECK: invoke{{ }} 142// CHECK: invoke{{ }} 143// CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]] 144#line 1200 145bar b[1] = { // 146 (fn(), // 147 bar())}; 148 149// CHECK-LABEL: define 150__complex double f11() { 151 __complex double f; 152// CHECK: store {{.*}} !dbg [[DBG_F11:!.*]] 153#line 1300 154 return f; 155} 156 157// CHECK-LABEL: define 158void f12() { 159 int f12_1(); 160 void f12_2(int = f12_1()); 161// CHECK: call {{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]] 162#line 1400 163 f12_2(); 164} 165 166// CHECK-LABEL: define 167void f13() { 168// CHECK: call {{.*}} !dbg [[DBG_F13:!.*]] 169#define F13_IMPL 1, src() 170 1, 171#line 1500 172 F13_IMPL; 173} 174 175struct f14_impl { 176 f14_impl(int); 177}; 178 179// CHECK-LABEL: define 180struct f14_use { 181// CHECK: call {{.*}}f14_impl{{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]] 182#line 1600 183 f14_impl v{// 184 1}; 185 f14_use(); 186}; 187 188f14_use::f14_use() = default; 189 190// CHECK-LABEL: define 191// CHECK-LABEL: define 192void func(foo); 193void f15(foo *f) { 194 func( 195// CHECK: getelementptr {{.*}}, !dbg [[DBG_F15:![0-9]*]] 196#line 1700 197 f[3]); 198} 199 200// CHECK-LABEL: define 201void f16(__complex float f) { 202 __complex float g = // 203// CHECK: add {{.*}}, !dbg [[DBG_F16:![0-9]*]] 204#line 1800 205 f + 1; 206} 207 208// CHECK-LABEL: define 209void f17(int *x) { 210 1, 211// CHECK: getelementptr {{.*}}, !dbg [[DBG_F17:![0-9]*]] 212#line 1900 213 x[1]; 214} 215 216// CHECK-LABEL: define 217void f18(int a, int b) { 218// CHECK: icmp {{.*}}, !dbg [[DBG_F18_1:![0-9]*]] 219// CHECK: br {{.*}}, !dbg [[DBG_F18_2:![0-9]*]] 220#line 2000 221 if (a // 222 && // 223 b) 224 ; 225} 226 227// CHECK-LABEL: define 228void f19(int a, int b) { 229// CHECK: icmp {{.*}}, !dbg [[DBG_F19_1:![0-9]*]] 230// CHECK: br {{.*}}, !dbg [[DBG_F19_2:![0-9]*]] 231#line 2100 232 if (a // 233 || // 234 b) 235 ; 236} 237 238// CHECK-LABEL: define 239void f20(int a, int b, int c) { 240// CHECK: icmp {{.*}}, !dbg [[DBG_F20_1:![0-9]*]] 241// FIXME: Conditional operator's exprloc should be the '?' not the start of the 242// expression, then this would go in the right place. (but adding getExprLoc to 243// the ConditionalOperator breaks the ARC migration tool - need to investigate 244// further). 245// CHECK: br {{.*}}, !dbg [[DBG_F20_1]] 246#line 2200 247 if (a // 248 ? // 249 b : c) 250 ; 251} 252 253// CHECK-LABEL: define 254int f21_a(int = 0); 255void f21_b(int = f21_a()); 256void f21() { 257// CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]] 258#line 2300 259 f21_b(); 260} 261 262// CHECK-LABEL: define 263struct f22_dtor { 264 ~f22_dtor(); 265}; 266void f22() { 267 { 268 f22_dtor f; 269 src(); 270// CHECK: invoke {{.*}}src 271// CHECK: call {{.*}}, !dbg [[DBG_F22:![0-9]*]] 272// CHECK: call {{.*}}, !dbg [[DBG_F22]] 273#line 2400 274 } 275} 276 277// CHECK-LABEL: define 278struct f23_struct { 279}; 280f23_struct f23_a(); 281void f23_b(f23_struct = f23_a()); 282void f23() { 283// CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]] 284#line 2500 285 f23_b(); 286} 287 288// CHECK-LABEL: define 289void f24_a(__complex float = complex_src()); 290void f24() { 291// CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]] 292#line 2600 293 f24_a(); 294} 295 296// CHECK: [[DBG_F1]] = !MDLocation(line: 100, 297// CHECK: [[DBG_FOO_VALUE]] = !MDLocation(line: 200, 298// CHECK: [[DBG_FOO_REF]] = !MDLocation(line: 202, 299// CHECK: [[DBG_FOO_COMPLEX]] = !MDLocation(line: 204, 300// CHECK: [[DBG_F2]] = !MDLocation(line: 300, 301// CHECK: [[DBG_F3]] = !MDLocation(line: 400, 302// CHECK: [[DBG_F4]] = !MDLocation(line: 500, 303// CHECK: [[DBG_F5]] = !MDLocation(line: 600, 304// CHECK: [[DBG_F6]] = !MDLocation(line: 700, 305// CHECK: [[DBG_F7]] = !MDLocation(line: 800, 306// CHECK: [[DBG_F8]] = !MDLocation(line: 900, 307// CHECK: [[DBG_F9]] = !MDLocation(line: 1000, 308// CHECK: [[DBG_F10_STORE]] = !MDLocation(line: 1100, 309// CHECK: [[DBG_GLBL_CTOR_B]] = !MDLocation(line: 1200, 310// CHECK: [[DBG_GLBL_DTOR_B]] = !MDLocation(line: 1200, 311// CHECK: [[DBG_F11]] = !MDLocation(line: 1300, 312// CHECK: [[DBG_F12]] = !MDLocation(line: 1400, 313// CHECK: [[DBG_F13]] = !MDLocation(line: 1500, 314// CHECK: [[DBG_F14_CTOR_CALL]] = !MDLocation(line: 1600, 315// CHECK: [[DBG_F15]] = !MDLocation(line: 1700, 316// CHECK: [[DBG_F16]] = !MDLocation(line: 1800, 317// CHECK: [[DBG_F17]] = !MDLocation(line: 1900, 318// CHECK: [[DBG_F18_1]] = !MDLocation(line: 2000, 319// CHECK: [[DBG_F18_2]] = !MDLocation(line: 2001, 320// CHECK: [[DBG_F19_1]] = !MDLocation(line: 2100, 321// CHECK: [[DBG_F19_2]] = !MDLocation(line: 2101, 322// CHECK: [[DBG_F20_1]] = !MDLocation(line: 2200, 323// CHECK: [[DBG_F23]] = !MDLocation(line: 2500, 324// CHECK: [[DBG_F24]] = !MDLocation(line: 2600, 325