1 // RUN: %clang_cc1 -no-opaque-pointers -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s 2 // RUN: %clang_cc1 -no-opaque-pointers -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s 3 // RUN: %clang_cc1 -no-opaque-pointers -w -debug-info-kind=line-directives-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s 4 // RUN: %clang_cc1 -no-opaque-pointers -w -debug-info-kind=line-directives-only -std=c++11 -fexceptions -fcxx-exceptions -S -mllvm -no-discriminators -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s 5 6 int &src(); 7 int *sink(); 8 extern "C" __complex float complex_src(); 9 extern "C" __complex float *complex_sink(); 10 11 // CHECK-LABEL: define 12 void f1() { 13 *sink() 14 // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] 15 #line 100 16 = // 17 src(); 18 } 19 20 struct foo { 21 int i; 22 int &j; 23 __complex float k; 24 foo(); 25 }; 26 27 // CHECK-LABEL: define 28 foo::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{{.*}} 40 void f2() { 41 // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]] 42 *complex_sink() 43 #line 300 44 = // 45 complex_src(); 46 } 47 48 // CHECK-LABEL: define 49 void f3() { 50 // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]] 51 *complex_sink() 52 #line 400 53 += // 54 complex_src(); 55 } 56 57 // CHECK-LABEL: define 58 void f4() { 59 #line 500 60 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] 61 = src(); 62 } 63 64 // CHECK-LABEL: define 65 void f5() { 66 #line 600 67 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]] 68 = complex_src(); 69 } 70 71 struct agg { int i; }; 72 agg agg_src(); 73 74 // CHECK-LABEL: define 75 void 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 85 void 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 94 void 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 103 void 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 111 inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; } 112 113 // CHECK-LABEL: define 114 void 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 123 void fn() noexcept(true); 124 125 struct 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 145 bar b[1] = { // 146 (fn(), // 147 bar())}; 148 149 // CHECK-LABEL: define{{.*}}f11 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 158 void f12() { 159 int f12_1(); 160 void f12_2(int = f12_1()); 161 // CHECK: call {{.*}}{{(signext )?}}i32 noundef {{.*}} !dbg [[DBG_F12:!.*]] 162 #line 1400 163 f12_2(); 164 } 165 166 // CHECK-LABEL: define 167 void f13() { 168 // CHECK: call {{.*}} !dbg [[DBG_F13:!.*]] 169 #define F13_IMPL 1, src() 170 1, 171 #line 1500 172 F13_IMPL; 173 } 174 175 struct f14_impl { 176 f14_impl(int); 177 }; 178 179 // CHECK-LABEL: define 180 struct 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 188 f14_use::f14_use() = default; 189 190 // CHECK-LABEL: define 191 // CHECK-LABEL: define 192 void func(foo); 193 void 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 201 void 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 209 void 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 217 void 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 228 void 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 239 void 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 254 int f21_a(int = 0); 255 void f21_b(int = f21_a()); 256 void f21() { 257 // CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]] 258 #line 2300 259 f21_b(); 260 } 261 262 // CHECK-LABEL: define 263 struct f22_dtor { 264 ~f22_dtor(); 265 }; 266 void 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 278 struct f23_struct { 279 }; 280 f23_struct f23_a(); 281 void f23_b(f23_struct = f23_a()); 282 void f23() { 283 // CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]] 284 #line 2500 285 f23_b(); 286 } 287 288 // CHECK-LABEL: define 289 void f24_a(__complex float = complex_src()); 290 void f24() { 291 // CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]] 292 #line 2600 293 f24_a(); 294 } 295 296 // CHECK-LABEL: define 297 void f25_a(int x = __builtin_LINE()) {} 298 void f25() { 299 // CHECK: call void @_Z5f25_ai(i32 noundef {{(signext )?}}2700) 300 #line 2700 301 f25_a(); 302 } 303 // CHECK: [[DBG_F1]] = !DILocation(line: 100, 304 // CHECK: [[DBG_FOO_VALUE]] = !DILocation(line: 200, 305 // CHECK: [[DBG_FOO_REF]] = !DILocation(line: 202, 306 // CHECK: [[DBG_FOO_COMPLEX]] = !DILocation(line: 204, 307 // CHECK: [[DBG_F2]] = !DILocation(line: 300, 308 // CHECK: [[DBG_F3]] = !DILocation(line: 400, 309 // CHECK: [[DBG_F4]] = !DILocation(line: 500, 310 // CHECK: [[DBG_F5]] = !DILocation(line: 600, 311 // CHECK: [[DBG_F6]] = !DILocation(line: 700, 312 // CHECK: [[DBG_F7]] = !DILocation(line: 800, 313 // CHECK: [[DBG_F8]] = !DILocation(line: 900, 314 // CHECK: [[DBG_F9]] = !DILocation(line: 1000, 315 // CHECK: [[DBG_F10_STORE]] = !DILocation(line: 1100, 316 // CHECK: [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200, 317 // CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 0, 318 // CHECK: [[DBG_F11]] = !DILocation(line: 1300, 319 // CHECK: [[DBG_F12]] = !DILocation(line: 1400, 320 // CHECK: [[DBG_F13]] = !DILocation(line: 1500, 321 // CHECK: [[DBG_F14_CTOR_CALL]] = !DILocation(line: 1600, 322 // CHECK: [[DBG_F15]] = !DILocation(line: 1700, 323 // CHECK: [[DBG_F16]] = !DILocation(line: 1800, 324 // CHECK: [[DBG_F17]] = !DILocation(line: 1900, 325 // CHECK: [[DBG_F18_1]] = !DILocation(line: 2000, 326 // CHECK: [[DBG_F18_2]] = !DILocation(line: 2001, 327 // CHECK: [[DBG_F19_1]] = !DILocation(line: 2100, 328 // CHECK: [[DBG_F19_2]] = !DILocation(line: 2101, 329 // CHECK: [[DBG_F20_1]] = !DILocation(line: 2200, 330 // CHECK: [[DBG_F23]] = !DILocation(line: 2500, 331 // CHECK: [[DBG_F24]] = !DILocation(line: 2600, 332