warn-unreachable.c revision 31ceb61172bca7ebc3fb90e9125864c7a29c55c0
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-switch-enum-redundant-default
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint halt() __attribute__((noreturn));
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint live();
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int dead();
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid test1() {
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto c;
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  d:
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto e;       // expected-warning {{will never be executed}}
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  c: ;
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int i;
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return;
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto b;        // expected-warning {{will never be executed}}
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto a;        // expected-warning {{will never be executed}}
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  b:
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  i = 1;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  a:
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  i = 2;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto f;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  e:
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  goto d;
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  f: ;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void test2() {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int i;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (live()) {
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  case 1:
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    halt(),
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      dead();   // expected-warning {{will never be executed}}
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  case 2:
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    live(), halt(),
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      dead();   // expected-warning {{will never be executed}}
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  case 3:
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  live()
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    +           // expected-warning {{will never be executed}}
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    halt();
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dead();
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  case 4:
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  a4:
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    live(),
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      halt();
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    goto a4;    // expected-warning {{will never be executed}}
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  case 5:
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    goto a5;
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  c5:
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    dead();     // expected-warning {{will never be executed}}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    goto b5;
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  a5:
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    live(),
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      halt();
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  b5:
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    goto c5;
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  case 6:
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (live())
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      goto e6;
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    live(),
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      halt();
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  d6:
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    dead();     // expected-warning {{will never be executed}}
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    goto b6;
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  c6:
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    dead();
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    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// Test case for PR 9774.  Tests that dead code in macros aren't warned about.
129#define MY_MAX(a,b)     ((a) >= (b) ? (a) : (b))
130void PR9774(int *s) {
131    for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
132        s[i] = 0;
133}
134
135