summaryrefslogtreecommitdiffstats
path: root/clang/test/Misc/caret-diags-multiline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Misc/caret-diags-multiline.cpp')
-rw-r--r--clang/test/Misc/caret-diags-multiline.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/clang/test/Misc/caret-diags-multiline.cpp b/clang/test/Misc/caret-diags-multiline.cpp
new file mode 100644
index 00000000000..4826d9beaa3
--- /dev/null
+++ b/clang/test/Misc/caret-diags-multiline.cpp
@@ -0,0 +1,234 @@
+// 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
+ );
+}
OpenPOWER on IntegriCloud