forked from OSchip/llvm-project
235 lines
5.7 KiB
C++
235 lines
5.7 KiB
C++
// RUN: not %clang_cc1 -std=c++11 -fcaret-diagnostics-max-lines 5 -Wsometimes-uninitialized %s 2>&1 | FileCheck %s --strict-whitespace
|
|
|
|
void line(int);
|
|
|
|
// Check we expand the range as much as possible within the limit.
|
|
|
|
// CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~{{$}}
|
|
// CHECK-NEXT: note: uninitialized use occurs here
|
|
// CHECK-NEXT: {{^}} return a;
|
|
// CHECK-NEXT: {{^}} ^
|
|
// CHECK-NEXT: note: remove the 'if' if its condition is always false
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(1);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} } else {
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: note: initialize the variable
|
|
int f1(int cond) {
|
|
int a;
|
|
if (cond) {
|
|
line(1);
|
|
} else {
|
|
a = 3;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~{{$}}
|
|
// CHECK-NEXT: note: uninitialized use occurs here
|
|
// CHECK-NEXT: {{^}} return a;
|
|
// CHECK-NEXT: {{^}} ^
|
|
// CHECK-NEXT: note: remove the 'if' if its condition is always false
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(1);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(2);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} } else {
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: note: initialize the variable
|
|
int f2(int cond) {
|
|
int a;
|
|
if (cond) {
|
|
line(1);
|
|
line(2);
|
|
} else {
|
|
a = 3;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~{{$}}
|
|
// CHECK-NEXT: note: uninitialized use occurs here
|
|
// CHECK-NEXT: {{^}} return a;
|
|
// CHECK-NEXT: {{^}} ^
|
|
// CHECK-NEXT: note: remove the 'if' if its condition is always false
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(1);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(2);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(3);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} } else {
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: note: initialize the variable
|
|
int f3(int cond) {
|
|
int a;
|
|
if (cond) {
|
|
line(1);
|
|
line(2);
|
|
line(3);
|
|
} else {
|
|
a = 3;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~{{$}}
|
|
// CHECK-NEXT: note: uninitialized use occurs here
|
|
// CHECK-NEXT: {{^}} return a;
|
|
// CHECK-NEXT: {{^}} ^
|
|
// CHECK-NEXT: note: remove the 'if' if its condition is always false
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(1);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(2);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(3);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(4);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: note: initialize the variable
|
|
int f4(int cond) {
|
|
int a;
|
|
if (cond) {
|
|
line(1);
|
|
line(2);
|
|
line(3);
|
|
line(4);
|
|
} else {
|
|
a = 3;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
// CHECK: warning: variable 'a' is used uninitialized whenever 'if' condition is true
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~{{$}}
|
|
// CHECK-NEXT: note: uninitialized use occurs here
|
|
// CHECK-NEXT: {{^}} return a;
|
|
// CHECK-NEXT: {{^}} ^
|
|
// CHECK-NEXT: note: remove the 'if' if its condition is always false
|
|
// CHECK-NEXT: {{^}} if (cond) {
|
|
// CHECK-NEXT: {{^}} ^~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(1);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(2);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(3);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: {{^}} line(4);
|
|
// CHECK-NEXT: {{^}}~~~~~~~~~~~~{{$}}
|
|
// CHECK-NEXT: note: initialize the variable
|
|
int f5(int cond) {
|
|
int a;
|
|
if (cond) {
|
|
line(1);
|
|
line(2);
|
|
line(3);
|
|
line(4);
|
|
line(5);
|
|
} else {
|
|
a = 3;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
|
|
// Check that we don't include lines with no interesting code if we can't reach
|
|
// the interesting part within the line limit.
|
|
|
|
// CHECK: error: no matching function for call to 'g
|
|
|
|
// CHECK: note: candidate template ignored: substitution failure
|
|
// CHECK-NEXT: {{^}}decltype(T()
|
|
// CHECK-NEXT: {{^}} ~{{$}}
|
|
// CHECK-NEXT: {{^}} + 1
|
|
// CHECK-NEXT: {{^}} + 2
|
|
// CHECK-NEXT: {{^}} + 3
|
|
// CHECK-NEXT: {{^}}void g();
|
|
// CHECK-NEXT: {{^}} ^{{$}}
|
|
template<typename T>
|
|
decltype(T()
|
|
+ 1
|
|
+ 2
|
|
+ 3)
|
|
void g();
|
|
|
|
// CHECK: note: candidate template ignored: substitution failure
|
|
// CHECK-NEXT: {{^}}void g();
|
|
// CHECK-NEXT: {{^}} ^{{$}}
|
|
template<typename T>
|
|
decltype(T()
|
|
+ 1
|
|
+ 2
|
|
+ 3
|
|
+ 4)
|
|
void g();
|
|
|
|
void h() { g<int()>(); }
|
|
|
|
|
|
void multiple_ranges(int a, int b) {
|
|
// CHECK: error: invalid operands
|
|
// CHECK-NEXT: &(a)
|
|
// CHECK-NEXT: ~~~~
|
|
// CHECK-NEXT: +
|
|
// CHECK-NEXT: ^
|
|
// CHECK-NEXT: &(b)
|
|
// CHECK-NEXT: ~~~~
|
|
&(a)
|
|
+
|
|
&(b);
|
|
|
|
// CHECK-NEXT: error: invalid operands
|
|
// CHECK-NEXT: &(
|
|
// CHECK-NEXT: ~~
|
|
// CHECK-NEXT: a
|
|
// CHECK-NEXT: ~
|
|
// CHECK-NEXT: )
|
|
// CHECK-NEXT: ~
|
|
// CHECK-NEXT: +
|
|
// CHECK-NEXT: ^
|
|
// CHECK-NEXT: &(
|
|
// CHECK-NEXT: ~~
|
|
&(
|
|
a
|
|
)
|
|
+
|
|
&(
|
|
b
|
|
);
|
|
|
|
// CHECK-NEXT: error: invalid operands
|
|
// CHECK-NEXT: &(a
|
|
// CHECK-NEXT: ~~
|
|
// CHECK-NEXT: )
|
|
// CHECK-NEXT: ~
|
|
// CHECK-NEXT: +
|
|
// CHECK-NEXT: ^
|
|
// CHECK-NEXT: &(
|
|
// CHECK-NEXT: ~~
|
|
// CHECK-NEXT: b
|
|
// CHECK-NEXT: ~
|
|
&(a
|
|
)
|
|
+
|
|
&(
|
|
b
|
|
);
|
|
}
|