warn-unreachable.c revision e7a2764b2c98859aa42a3fd36d55cd34c7fe883e
1// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value
2
3int halt() __attribute__((noreturn));
4int live();
5int dead();
6
7void test1() {
8  goto c;
9  d:
10  goto e;       // expected-warning {{will never be executed}}
11  c: ;
12  int i;
13  return;
14  goto b;        // expected-warning {{will never be executed}}
15  goto a;        // expected-warning {{will never be executed}}
16  b:
17  i = 1;
18  a:
19  i = 2;
20  goto f;
21  e:
22  goto d;
23  f: ;
24}
25
26void test2() {
27  int i;
28  switch (live()) {
29  case 1:
30    halt(),
31      dead();   // expected-warning {{will never be executed}}
32
33  case 2:
34    live(), halt(),
35      dead();   // expected-warning {{will never be executed}}
36
37  case 3:
38  live()
39    +           // expected-warning {{will never be executed}}
40    halt();
41  dead();
42
43  case 4:
44  a4:
45    live(),
46      halt();
47    goto a4;    // expected-warning {{will never be executed}}
48
49  case 5:
50    goto a5;
51  c5:
52    dead();     // expected-warning {{will never be executed}}
53    goto b5;
54  a5:
55    live(),
56      halt();
57  b5:
58    goto c5;
59
60  case 6:
61    if (live())
62      goto e6;
63    live(),
64      halt();
65  d6:
66    dead();     // expected-warning {{will never be executed}}
67    goto b6;
68  c6:
69    dead();
70    goto b6;
71  e6:
72    live(),
73      halt();
74  b6:
75    goto c6;
76  case 7:
77    halt()
78      +
79      dead();   // expected-warning {{will never be executed}}
80    -           // expected-warning {{will never be executed}}
81      halt();
82  case 8:
83    i           // expected-warning {{will never be executed}}
84      +=
85      halt();
86  case 9:
87    halt()
88      ?         // expected-warning {{will never be executed}}
89      dead() : dead();
90  case 10:
91    (           // expected-warning {{will never be executed}}
92      float)halt();
93  case 11: {
94    int a[5];
95    live(),
96      a[halt()  // expected-warning {{will never be executed}}
97        ];
98  }
99  }
100}
101
102enum Cases { C1, C2, C3 };
103int test_enum_cases(enum Cases C) {
104  switch (C) {
105    case C1:
106    case C2:
107    case C3:
108      return 1;
109    default: {
110      int i = 0; // expected-warning{{will never be executed}}
111      ++i;
112      return i;
113    }
114  }
115}
116
117// Handle unreachable code triggered by macro expansions.
118void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
119
120#define myassert(e) \
121    (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
122
123void test_assert() {
124  myassert(0 && "unreachable");
125  return; // no-warning
126}
127
128
129