blob: 6694a732c591ba5fcc42fc9e797c30fbf52c76a5 [file] [log] [blame]
David Blaikie0b7fad62014-12-08 21:48:57 +00001// RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
2
David Blaikie538deff2014-12-09 20:52:24 +00003int &src();
David Blaikie8ec8dfe2014-12-09 21:10:43 +00004int *sink();
Reid Kleckner60e54da2014-12-10 00:47:33 +00005extern "C" __complex float complex_src();
6extern "C" __complex float *complex_sink();
David Blaikie0b7fad62014-12-08 21:48:57 +00007
David Blaikie8ec8dfe2014-12-09 21:10:43 +00008// CHECK-LABEL: define
David Blaikie0b7fad62014-12-08 21:48:57 +00009void f1() {
10#line 100
11 * // The store for the assignment should be attributed to the start of the
David Blaikie8ec8dfe2014-12-09 21:10:43 +000012 // assignment expression here, regardless of the location of subexpressions.
13 sink() = src();
David Blaikie73ca5692014-12-09 00:32:22 +000014 // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
David Blaikie0b7fad62014-12-08 21:48:57 +000015}
16
David Blaikie73ca5692014-12-09 00:32:22 +000017struct foo {
18 int i;
19 int &j;
David Blaikie538deff2014-12-09 20:52:24 +000020 __complex float k;
David Blaikie73ca5692014-12-09 00:32:22 +000021 foo();
22};
23
David Blaikie8ec8dfe2014-12-09 21:10:43 +000024// CHECK-LABEL: define
David Blaikie73ca5692014-12-09 00:32:22 +000025foo::foo()
David Blaikie8ec8dfe2014-12-09 21:10:43 +000026 :
David Blaikie73ca5692014-12-09 00:32:22 +000027#line 200
David Blaikie8ec8dfe2014-12-09 21:10:43 +000028 i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]]
29 (src()),
30 j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]]
31 (src()),
32 k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]]
33 (complex_src()) {
34}
35
Reid Kleckner60e54da2014-12-10 00:47:33 +000036// CHECK-LABEL: define {{.*}}f2{{.*}}
David Blaikie8ec8dfe2014-12-09 21:10:43 +000037void f2() {
38#line 300
David Blaikie93e9cf82014-12-09 21:32:00 +000039 * // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]]
David Blaikie8ec8dfe2014-12-09 21:10:43 +000040 complex_sink() = complex_src();
David Blaikie73ca5692014-12-09 00:32:22 +000041}
42
David Blaikie93e9cf82014-12-09 21:32:00 +000043// CHECK-LABEL: define
44void f3() {
45#line 400
46 * // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]]
47 complex_sink() += complex_src();
48}
49
David Blaikie7f138812014-12-09 22:04:13 +000050// CHECK-LABEL: define
51void f4() {
52#line 500
53 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]]
54 = src();
55}
56
David Blaikie00de22f2014-12-09 22:15:02 +000057// CHECK-LABEL: define
58void f5() {
59#line 600
60 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]]
61 = complex_src();
62}
63
David Blaikied73f3c62014-12-09 23:33:26 +000064struct agg { int i; };
65agg agg_src();
66
67// CHECK-LABEL: define
68void f6() {
69 agg x;
70#line 700
71 x // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]]
72 = agg_src();
73}
74
David Blaikief0aceb22014-12-10 01:03:48 +000075// CHECK-LABEL: define
76void f7() {
77 int *src1();
78 int src2();
79#line 800
80 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]]
81 src1())[src2()];
82}
83
David Blaikied85548d2014-12-10 01:16:09 +000084// CHECK-LABEL: define
85void f8() {
86 int src1[1];
87 int src2();
88#line 900
89 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]]
90 src1)[src2()];
91}
92
David Blaikie7c5da412014-12-10 01:34:25 +000093// CHECK-LABEL: define
94void f9(int i) {
95 int src1[1][i];
96 int src2();
97#line 1000
98 auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]]
99 src1)[src2()];
100}
101
David Blaikie09f12fa2014-12-14 18:48:18 +0000102inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; }
David Blaikiea2c11242014-12-10 19:04:09 +0000103
104// CHECK-LABEL: define
105void f10() {
106 void *void_src();
David Blaikie09f12fa2014-12-14 18:48:18 +0000107 ( // CHECK: icmp {{.*}} !dbg [[DBG_F10_ICMP:.*]]
108 // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]]
David Blaikiea2c11242014-12-10 19:04:09 +0000109#line 1100
110 new (void_src()) int(src()));
111}
112
David Blaikie73ca5692014-12-09 00:32:22 +0000113// CHECK: [[DBG_F1]] = metadata !{i32 100,
114// CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200,
David Blaikie8ec8dfe2014-12-09 21:10:43 +0000115// CHECK: [[DBG_FOO_REF]] = metadata !{i32 202,
116// CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 204,
David Blaikie93e9cf82014-12-09 21:32:00 +0000117// CHECK: [[DBG_F2]] = metadata !{i32 300,
118// CHECK: [[DBG_F3]] = metadata !{i32 400,
David Blaikie7f138812014-12-09 22:04:13 +0000119// CHECK: [[DBG_F4]] = metadata !{i32 500,
David Blaikie00de22f2014-12-09 22:15:02 +0000120// CHECK: [[DBG_F5]] = metadata !{i32 600,
David Blaikied73f3c62014-12-09 23:33:26 +0000121// CHECK: [[DBG_F6]] = metadata !{i32 700,
David Blaikief0aceb22014-12-10 01:03:48 +0000122// CHECK: [[DBG_F7]] = metadata !{i32 800,
David Blaikied85548d2014-12-10 01:16:09 +0000123// CHECK: [[DBG_F8]] = metadata !{i32 900,
David Blaikie7c5da412014-12-10 01:34:25 +0000124// CHECK: [[DBG_F9]] = metadata !{i32 1000,
David Blaikie09f12fa2014-12-14 18:48:18 +0000125// CHECK: [[DBG_F10_ICMP]] = metadata !{i32 1100,
126// CHECK: [[DBG_F10_STORE]] = metadata !{i32 1100,