unreachable-code-path.c revision 5e04bdde8e74d991feffe9cf95d731f7e473dbb7
1// RUN: %clang_cc1 -analyze -analyzer-experimental-checks -analyzer-check-objc-mem -analyzer-check-dead-stores -verify -analyzer-opt-analyze-nested-blocks %s
2
3extern void foo(int a);
4
5void test(unsigned a) {
6  switch (a) {
7    a += 5; // expected-warning{{never executed}}
8  case 2:
9    a *= 10;
10  case 3:
11    a %= 2;
12  }
13  foo(a);
14}
15
16void test2(unsigned a) {
17 help:
18  if (a > 0)
19    return;
20  if (a == 0)
21    return;
22  foo(a); // expected-warning{{never executed}}
23  goto help;
24}
25
26void test3() {
27  int a = 5;
28
29  while (a > 1)
30    a -= 2;
31
32  if (a > 1) {
33    a = a + 56; // expected-warning{{never executed}}
34  }
35
36  foo(a);
37}
38
39void test4(unsigned a) {
40  while(1);
41  if (a > 5) { // expected-warning{{never executed}}
42    return;
43  }
44}
45
46extern void bar(char c);
47
48void test5(const char *c) {
49  foo(c[0]);
50
51  if (!c) {
52    bar(1); // expected-warning{{never executed}}
53  }
54}
55
56void test6(const char *c) {
57  if (c) return;
58  if (!c) return;
59  __builtin_unreachable(); // no-warning
60}
61
62