1 // RUN: not %clang_cc1 -std=c++11 -fcaret-diagnostics-max-lines 5 -Wsometimes-uninitialized %s 2>&1 | FileCheck %s --strict-whitespace
2
3 void line(int);
4
5 // Check we expand the range as much as possible within the limit.
6
7 // CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
8 // CHECK-NEXT: {{^}} if (cond) {
9 // CHECK-NEXT: {{^}} ^~~~{{$}}
10 // CHECK-NEXT: note: uninitialized use occurs here
11 // CHECK-NEXT: {{^}} return a;
12 // CHECK-NEXT: {{^}} ^
13 // CHECK-NEXT: note: remove the 'if' if its condition is always false
14 // CHECK-NEXT: {{^}} if (cond) {
15 // CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
16 // CHECK-NEXT: {{^}} line(1);
17 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
18 // CHECK-NEXT: {{^}} } else {
19 // CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
20 // CHECK-NEXT: note: initialize the variable
f1(int cond)21 int f1(int cond) {
22 int a;
23 if (cond) {
24 line(1);
25 } else {
26 a = 3;
27 }
28 return a;
29 }
30
31 // CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
32 // CHECK-NEXT: {{^}} if (cond) {
33 // CHECK-NEXT: {{^}} ^~~~{{$}}
34 // CHECK-NEXT: note: uninitialized use occurs here
35 // CHECK-NEXT: {{^}} return a;
36 // CHECK-NEXT: {{^}} ^
37 // CHECK-NEXT: note: remove the 'if' if its condition is always false
38 // CHECK-NEXT: {{^}} if (cond) {
39 // CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
40 // CHECK-NEXT: {{^}} line(1);
41 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
42 // CHECK-NEXT: {{^}} line(2);
43 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
44 // CHECK-NEXT: {{^}} } else {
45 // CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
46 // CHECK-NEXT: note: initialize the variable
f2(int cond)47 int f2(int cond) {
48 int a;
49 if (cond) {
50 line(1);
51 line(2);
52 } else {
53 a = 3;
54 }
55 return a;
56 }
57
58 // CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
59 // CHECK-NEXT: {{^}} if (cond) {
60 // CHECK-NEXT: {{^}} ^~~~{{$}}
61 // CHECK-NEXT: note: uninitialized use occurs here
62 // CHECK-NEXT: {{^}} return a;
63 // CHECK-NEXT: {{^}} ^
64 // CHECK-NEXT: note: remove the 'if' if its condition is always false
65 // CHECK-NEXT: {{^}} if (cond) {
66 // CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
67 // CHECK-NEXT: {{^}} line(1);
68 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
69 // CHECK-NEXT: {{^}} line(2);
70 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
71 // CHECK-NEXT: {{^}} line(3);
72 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
73 // CHECK-NEXT: {{^}} } else {
74 // CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
75 // CHECK-NEXT: note: initialize the variable
f3(int cond)76 int f3(int cond) {
77 int a;
78 if (cond) {
79 line(1);
80 line(2);
81 line(3);
82 } else {
83 a = 3;
84 }
85 return a;
86 }
87
88 // CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
89 // CHECK-NEXT: {{^}} if (cond) {
90 // CHECK-NEXT: {{^}} ^~~~{{$}}
91 // CHECK-NEXT: note: uninitialized use occurs here
92 // CHECK-NEXT: {{^}} return a;
93 // CHECK-NEXT: {{^}} ^
94 // CHECK-NEXT: note: remove the 'if' if its condition is always false
95 // CHECK-NEXT: {{^}} if (cond) {
96 // CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
97 // CHECK-NEXT: {{^}} line(1);
98 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
99 // CHECK-NEXT: {{^}} line(2);
100 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
101 // CHECK-NEXT: {{^}} line(3);
102 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
103 // CHECK-NEXT: {{^}} line(4);
104 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
105 // CHECK-NEXT: note: initialize the variable
f4(int cond)106 int f4(int cond) {
107 int a;
108 if (cond) {
109 line(1);
110 line(2);
111 line(3);
112 line(4);
113 } else {
114 a = 3;
115 }
116 return a;
117 }
118
119 // CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
120 // CHECK-NEXT: {{^}} if (cond) {
121 // CHECK-NEXT: {{^}} ^~~~{{$}}
122 // CHECK-NEXT: note: uninitialized use occurs here
123 // CHECK-NEXT: {{^}} return a;
124 // CHECK-NEXT: {{^}} ^
125 // CHECK-NEXT: note: remove the 'if' if its condition is always false
126 // CHECK-NEXT: {{^}} if (cond) {
127 // CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
128 // CHECK-NEXT: {{^}} line(1);
129 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
130 // CHECK-NEXT: {{^}} line(2);
131 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
132 // CHECK-NEXT: {{^}} line(3);
133 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
134 // CHECK-NEXT: {{^}} line(4);
135 // CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
136 // CHECK-NEXT: note: initialize the variable
f5(int cond)137 int f5(int cond) {
138 int a;
139 if (cond) {
140 line(1);
141 line(2);
142 line(3);
143 line(4);
144 line(5);
145 } else {
146 a = 3;
147 }
148 return a;
149 }
150
151
152 // Check that we don't include lines with no interesting code if we can't reach
153 // the interesting part within the line limit.
154
155 // CHECK: error: no matching function for call to 'g
156
157 // CHECK: note: candidate template ignored: substitution failure
158 // CHECK-NEXT: {{^}}decltype(T()
159 // CHECK-NEXT: {{^}} ~{{$}}
160 // CHECK-NEXT: {{^}} + 1
161 // CHECK-NEXT: {{^}} + 2
162 // CHECK-NEXT: {{^}} + 3
163 // CHECK-NEXT: {{^}}void g();
164 // CHECK-NEXT: {{^}} ^{{$}}
165 template<typename T>
166 decltype(T()
167 + 1
168 + 2
169 + 3)
170 void g();
171
172 // CHECK: note: candidate template ignored: substitution failure
173 // CHECK-NEXT: {{^}}void g();
174 // CHECK-NEXT: {{^}} ^{{$}}
175 template<typename T>
176 decltype(T()
177 + 1
178 + 2
179 + 3
180 + 4)
181 void g();
182
h()183 void h() { g<int()>(); }
184
185
multiple_ranges(int a,int b)186 void multiple_ranges(int a, int b) {
187 // CHECK: error: invalid operands
188 // CHECK-NEXT: &(a)
189 // CHECK-NEXT: ~~~~
190 // CHECK-NEXT: +
191 // CHECK-NEXT: ^
192 // CHECK-NEXT: &(b)
193 // CHECK-NEXT: ~~~~
194 &(a)
195 +
196 &(b);
197
198 // CHECK-NEXT: error: invalid operands
199 // CHECK-NEXT: &(
200 // CHECK-NEXT: ~~
201 // CHECK-NEXT: a
202 // CHECK-NEXT: ~
203 // CHECK-NEXT: )
204 // CHECK-NEXT: ~
205 // CHECK-NEXT: +
206 // CHECK-NEXT: ^
207 // CHECK-NEXT: &(
208 // CHECK-NEXT: ~~
209 &(
210 a
211 )
212 +
213 &(
214 b
215 );
216
217 // CHECK-NEXT: error: invalid operands
218 // CHECK-NEXT: &(a
219 // CHECK-NEXT: ~~
220 // CHECK-NEXT: )
221 // CHECK-NEXT: ~
222 // CHECK-NEXT: +
223 // CHECK-NEXT: ^
224 // CHECK-NEXT: &(
225 // CHECK-NEXT: ~~
226 // CHECK-NEXT: b
227 // CHECK-NEXT: ~
228 &(a
229 )
230 +
231 &(
232 b
233 );
234 }
235
236 #define pr33902_a(b) #b
237 #define pr33902_c(d) _Pragma(pr33902_a(d))
238 #define pr33902_e(f) pr33902_c(GCC warning #f)
239 pr33902_e() pr33902_e()
240