1 // RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
2 
3 int &src();
4 int *sink();
5 extern "C" __complex float complex_src();
6 extern "C" __complex float *complex_sink();
7 
8 // CHECK-LABEL: define
9 void f1() {
10 #line 100
11   * // The store for the assignment should be attributed to the start of the
12       // assignment expression here, regardless of the location of subexpressions.
13       sink() = src();
14   // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
15 }
16 
17 struct foo {
18   int i;
19   int &j;
20   __complex float k;
21   foo();
22 };
23 
24 // CHECK-LABEL: define
25 foo::foo()
26     :
27 #line 200
28       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 
36 // CHECK-LABEL: define {{.*}}f2{{.*}}
37 void f2() {
38 #line 300
39   * // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]]
40       complex_sink() = complex_src();
41 }
42 
43 // CHECK-LABEL: define
44 void f3() {
45 #line 400
46   * // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]]
47       complex_sink() += complex_src();
48 }
49 
50 // CHECK-LABEL: define
51 void f4() {
52 #line 500
53   auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]]
54       = src();
55 }
56 
57 // CHECK-LABEL: define
58 void f5() {
59 #line 600
60   auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]]
61       = complex_src();
62 }
63 
64 struct agg { int i; };
65 agg agg_src();
66 
67 // CHECK-LABEL: define
68 void f6() {
69   agg x;
70 #line 700
71   x // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]]
72       = agg_src();
73 }
74 
75 // CHECK-LABEL: define
76 void f7() {
77   int *src1();
78   int src2();
79 #line 800
80   int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]]
81       src1())[src2()];
82 }
83 
84 // CHECK-LABEL: define
85 void f8() {
86   int src1[1];
87   int src2();
88 #line 900
89   int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]]
90       src1)[src2()];
91 }
92 
93 // CHECK-LABEL: define
94 void 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 
102 // CHECK: [[DBG_F1]] = metadata !{i32 100,
103 // CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200,
104 // CHECK: [[DBG_FOO_REF]] = metadata !{i32 202,
105 // CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 204,
106 // CHECK: [[DBG_F2]] = metadata !{i32 300,
107 // CHECK: [[DBG_F3]] = metadata !{i32 400,
108 // CHECK: [[DBG_F4]] = metadata !{i32 500,
109 // CHECK: [[DBG_F5]] = metadata !{i32 600,
110 // CHECK: [[DBG_F6]] = metadata !{i32 700,
111 // CHECK: [[DBG_F7]] = metadata !{i32 800,
112 // CHECK: [[DBG_F8]] = metadata !{i32 900,
113 // CHECK: [[DBG_F9]] = metadata !{i32 1000,
114