| // RUN: %clang_cc1 -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - | FileCheck %s |
| // RUN: %clang_cc1 -gline-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s |
| |
| // XFAIL: win32 |
| |
| int &src(); |
| int *sink(); |
| extern "C" __complex float complex_src(); |
| extern "C" __complex float *complex_sink(); |
| |
| // CHECK-LABEL: define |
| void f1() { |
| #line 100 |
| * // The store for the assignment should be attributed to the start of the |
| // assignment expression here, regardless of the location of subexpressions. |
| sink() = src(); |
| // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] |
| } |
| |
| struct foo { |
| int i; |
| int &j; |
| __complex float k; |
| foo(); |
| }; |
| |
| // CHECK-LABEL: define |
| foo::foo() |
| : |
| #line 200 |
| i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]] |
| (src()), |
| j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]] |
| (src()), |
| k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]] |
| (complex_src()) { |
| } |
| |
| // CHECK-LABEL: define {{.*}}f2{{.*}} |
| void f2() { |
| #line 300 |
| * // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]] |
| complex_sink() = complex_src(); |
| } |
| |
| // CHECK-LABEL: define |
| void f3() { |
| #line 400 |
| * // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]] |
| complex_sink() += complex_src(); |
| } |
| |
| // CHECK-LABEL: define |
| void f4() { |
| #line 500 |
| auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] |
| = src(); |
| } |
| |
| // CHECK-LABEL: define |
| void f5() { |
| #line 600 |
| auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]] |
| = complex_src(); |
| } |
| |
| struct agg { int i; }; |
| agg agg_src(); |
| |
| // CHECK-LABEL: define |
| void f6() { |
| agg x; |
| #line 700 |
| x // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]] |
| = agg_src(); |
| } |
| |
| // CHECK-LABEL: define |
| void f7() { |
| int *src1(); |
| int src2(); |
| #line 800 |
| int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]] |
| src1())[src2()]; |
| } |
| |
| // CHECK-LABEL: define |
| void f8() { |
| int src1[1]; |
| int src2(); |
| #line 900 |
| int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]] |
| src1)[src2()]; |
| } |
| |
| // CHECK-LABEL: define |
| void f9(int i) { |
| int src1[1][i]; |
| int src2(); |
| #line 1000 |
| auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]] |
| src1)[src2()]; |
| } |
| |
| inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; } |
| |
| // CHECK-LABEL: define |
| void f10() { |
| void *void_src(); |
| ( // CHECK: icmp {{.*}} !dbg [[DBG_F10_ICMP:.*]] |
| // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]] |
| #line 1100 |
| new (void_src()) int(src())); |
| } |
| |
| // noexcept just to simplify the codegen a bit |
| void fn() noexcept(true); |
| |
| struct bar { |
| bar(); |
| // noexcept(false) to convolute the global dtor |
| ~bar() noexcept(false); |
| }; |
| // global ctor cleanup |
| // CHECK-LABEL: define |
| // CHECK: invoke{{ }} |
| // CHECK: invoke{{ }} |
| // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]] |
| |
| // terminate caller |
| // CHECK-LABEL: define |
| |
| // global dtor cleanup |
| // CHECK-LABEL: define |
| // CHECK: invoke{{ }} |
| // CHECK: invoke{{ }} |
| // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]] |
| #line 1500 |
| bar b[1] = { // |
| (fn(), // |
| bar())}; |
| |
| // CHECK-LABEL: define |
| __complex double f11() { |
| __complex double f; |
| // CHECK: store {{.*}} !dbg [[DBG_F11:!.*]] |
| #line 1200 |
| return f; |
| } |
| |
| // CHECK-LABEL: define |
| void f12() { |
| int f12_1(); |
| void f12_2(int = f12_1()); |
| // CHECK: call {{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]] |
| #line 1300 |
| f12_2(); |
| } |
| |
| // CHECK-LABEL: define |
| void f13() { |
| // CHECK: call {{.*}} !dbg [[DBG_F13:!.*]] |
| #define F13_IMPL 1, src() |
| 1, |
| #line 1400 |
| F13_IMPL; |
| } |
| |
| struct f14 { |
| f14(int); |
| }; |
| |
| // CHECK-LABEL: define |
| struct f14_use { |
| // CHECK: call {{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]] |
| #line 1600 |
| f14 v |
| = |
| 1; |
| f14_use(); |
| }; |
| |
| f14_use::f14_use() = default; |
| |
| // CHECK-LABEL: define |
| |
| // CHECK-LABEL: define |
| int f21_a(int = 0); |
| void f21_b(int = f21_a()); |
| void f21() { |
| // CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]] |
| #line 2300 |
| f21_b(); |
| } |
| |
| // CHECK: [[DBG_F1]] = !MDLocation(line: 100, |
| // CHECK: [[DBG_FOO_VALUE]] = !MDLocation(line: 200, |
| // CHECK: [[DBG_FOO_REF]] = !MDLocation(line: 202, |
| // CHECK: [[DBG_FOO_COMPLEX]] = !MDLocation(line: 204, |
| // CHECK: [[DBG_F2]] = !MDLocation(line: 300, |
| // CHECK: [[DBG_F3]] = !MDLocation(line: 400, |
| // CHECK: [[DBG_F4]] = !MDLocation(line: 500, |
| // CHECK: [[DBG_F5]] = !MDLocation(line: 600, |
| // CHECK: [[DBG_F6]] = !MDLocation(line: 700, |
| // CHECK: [[DBG_F7]] = !MDLocation(line: 800, |
| // CHECK: [[DBG_F8]] = !MDLocation(line: 900, |
| // CHECK: [[DBG_F9]] = !MDLocation(line: 1000, |
| // CHECK: [[DBG_F10_ICMP]] = !MDLocation(line: 1100, |
| // CHECK: [[DBG_F10_STORE]] = !MDLocation(line: 1100, |
| // CHECK: [[DBG_GLBL_CTOR_B]] = !MDLocation(line: 1500, |
| // CHECK: [[DBG_GLBL_DTOR_B]] = !MDLocation(line: 1500, |
| // CHECK: [[DBG_F11]] = !MDLocation(line: 1200, |
| // CHECK: [[DBG_F12]] = !MDLocation(line: 1300, |
| // CHECK: [[DBG_F13]] = !MDLocation(line: 1400, |