Clang Project

clang_source_code/test/Misc/caret-diags-multiline.cpp
1// RUN: not %clang_cc1 -std=c++11 -fcaret-diagnostics-max-lines 5 -Wsometimes-uninitialized %s 2>&1 | FileCheck %s --strict-whitespace
2
3void 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
21int 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
47int 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
76int 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
106int 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
137int 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: {{^}}     ^{{$}}
165template<typename T>
166decltype(T()
167    + 1
168    + 2
169    + 3)
170void g();
171
172// CHECK:      note: candidate template ignored: substitution failure
173// CHECK-NEXT: {{^}}void g();
174// CHECK-NEXT: {{^}}     ^{{$}}
175template<typename T>
176decltype(T()
177    + 1
178    + 2
179    + 3
180    + 4)
181void g();
182
183void h() { g<int()>(); }
184
185
186void 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)
239pr33902_e() pr33902_e()
240