240 lines · cpp
1// RUN: not %clang_cc1 -std=c++11 -fno-diagnostics-show-line-numbers -fcaret-diagnostics-max-lines=5 -Wsometimes-uninitialized %s 2>&1 | FileCheck %s --strict-whitespace2 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 true8// CHECK-NEXT: {{^}} if (cond) {9// CHECK-NEXT: {{^}} ^~~~{{$}}10// CHECK-NEXT: note: uninitialized use occurs here11// CHECK-NEXT: {{^}} return a;12// CHECK-NEXT: {{^}} ^13// CHECK-NEXT: note: remove the 'if' if its condition is always false14// 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 variable21int 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 true32// CHECK-NEXT: {{^}} if (cond) {33// CHECK-NEXT: {{^}} ^~~~{{$}}34// CHECK-NEXT: note: uninitialized use occurs here35// CHECK-NEXT: {{^}} return a;36// CHECK-NEXT: {{^}} ^37// CHECK-NEXT: note: remove the 'if' if its condition is always false38// 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 variable47int 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 true59// CHECK-NEXT: {{^}} if (cond) {60// CHECK-NEXT: {{^}} ^~~~{{$}}61// CHECK-NEXT: note: uninitialized use occurs here62// CHECK-NEXT: {{^}} return a;63// CHECK-NEXT: {{^}} ^64// CHECK-NEXT: note: remove the 'if' if its condition is always false65// 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 variable76int 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 true89// CHECK-NEXT: {{^}} if (cond) {90// CHECK-NEXT: {{^}} ^~~~{{$}}91// CHECK-NEXT: note: uninitialized use occurs here92// CHECK-NEXT: {{^}} return a;93// CHECK-NEXT: {{^}} ^94// CHECK-NEXT: note: remove the 'if' if its condition is always false95// 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 variable106int 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 true120// CHECK-NEXT: {{^}} if (cond) {121// CHECK-NEXT: {{^}} ^~~~{{$}}122// CHECK-NEXT: note: uninitialized use occurs here123// CHECK-NEXT: {{^}} return a;124// CHECK-NEXT: {{^}} ^125// CHECK-NEXT: note: remove the 'if' if its condition is always false126// 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 variable137int 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 reach153// the interesting part within the line limit.154 155// CHECK: error: no matching function for call to 'g156 157// CHECK: note: candidate template ignored: substitution failure158// CHECK-NEXT: {{^}}decltype(T()159// CHECK-NEXT: {{^}} ~{{$}}160// CHECK-NEXT: {{^}} + 1161// CHECK-NEXT: {{^}} + 2162// CHECK-NEXT: {{^}} + 3163// CHECK-NEXT: {{^}}void g();164// CHECK-NEXT: {{^}} ^{{$}}165template<typename T>166decltype(T()167 + 1168 + 2169 + 3)170void g();171 172// CHECK: note: candidate template ignored: substitution failure173// CHECK-NEXT: {{^}}void g();174// CHECK-NEXT: {{^}} ^{{$}}175template<typename T>176decltype(T()177 + 1178 + 2179 + 3180 + 4)181void g();182 183void h() { g<int()>(); }184 185 186void multiple_ranges(int a, int b) {187 // CHECK: error: invalid operands188 // 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 operands199 // CHECK-NEXT: &(200 // CHECK-NEXT: ~~201 // CHECK-NEXT: a202 // CHECK-NEXT: ~203 // CHECK-NEXT: )204 // CHECK-NEXT: ~205 // CHECK-NEXT: +206 // CHECK-NEXT: ^207 // CHECK-NEXT: &(208 // CHECK-NEXT: ~~209 &(210 a211 )212 +213 &(214 b215 );216 217 // CHECK-NEXT: error: invalid operands218 // CHECK-NEXT: &(a219 // CHECK-NEXT: ~~220 // CHECK-NEXT: )221 // CHECK-NEXT: ~222 // CHECK-NEXT: +223 // CHECK-NEXT: ^224 // CHECK-NEXT: &(225 // CHECK-NEXT: ~~226 // CHECK-NEXT: b227 // CHECK-NEXT: ~228 &(a229 )230 +231 &(232 b233 );234}235 236#define pr33902_a(b) #b237#define pr33902_c(d) _Pragma(pr33902_a(d))238#define pr33902_e(f) pr33902_c(GCC warning #f)239pr33902_e() pr33902_e()240