12dd52e3815d040e340a5d953d838cd2268e25372David Blaikie// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default
29a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump
35d1d7ae120c2c8e6cba5d2a712b33500a5aecc10Anders Carlssonint halt() __attribute__((noreturn));
48eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stumpint live();
58eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stumpint dead();
68eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
79a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stumpvoid test1() {
89a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto c;
99a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  d:
109a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto e;       // expected-warning {{will never be executed}}
119a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  c: ;
129a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  int i;
139a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  return;
149a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto b;        // expected-warning {{will never be executed}}
159a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto a;        // expected-warning {{will never be executed}}
169a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  b:
179a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  i = 1;
189a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  a:
199a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  i = 2;
209a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto f;
219a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  e:
229a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  goto d;
239a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump  f: ;
249a24dc1409ec1d073a7b346d3b02a0129192fb58Mike Stump}
258eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
268eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stumpvoid test2() {
2745db90de59f6effb7bd9a55660ca97aa3feadc6cMike Stump  int i;
288eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  switch (live()) {
298eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 1:
308eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    halt(),
318eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      dead();   // expected-warning {{will never be executed}}
328eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
338eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 2:
3455f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump    live(), halt(),
358eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      dead();   // expected-warning {{will never be executed}}
368eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
378eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 3:
38e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski  live()
39e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski    +           // expected-warning {{will never be executed}}
4055f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump    halt();
4155f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump  dead();
428eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
438eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 4:
448eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  a4:
458eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    live(),
468eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      halt();
478eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto a4;    // expected-warning {{will never be executed}}
488eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
498eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 5:
508eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto a5;
518eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  c5:
528eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    dead();     // expected-warning {{will never be executed}}
538eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto b5;
548eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  a5:
558eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    live(),
568eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      halt();
578eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  b5:
588eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto c5;
598eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump
608eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  case 6:
618eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    if (live())
628eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      goto e6;
638eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    live(),
648eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      halt();
658eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  d6:
668eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    dead();     // expected-warning {{will never be executed}}
678eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto b6;
688eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  c6:
698eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    dead();
708eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto b6;
718eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  e6:
728eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    live(),
738eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump      halt();
748eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  b6:
758eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump    goto c6;
7655f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump  case 7:
7755f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump    halt()
78e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski      +
79e1667190dff025936a21e5eb43889ac93b570468Marcin Swiderski      dead();   // expected-warning {{will never be executed}}
8055f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump    -           // expected-warning {{will never be executed}}
8155f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump      halt();
8245db90de59f6effb7bd9a55660ca97aa3feadc6cMike Stump  case 8:
830c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek    i           // expected-warning {{will never be executed}}
840c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek      +=
8545db90de59f6effb7bd9a55660ca97aa3feadc6cMike Stump      halt();
86e5fba7058ce34cc3d75e16e777ec6fc8096183f8Mike Stump  case 9:
87e5fba7058ce34cc3d75e16e777ec6fc8096183f8Mike Stump    halt()
88e5fba7058ce34cc3d75e16e777ec6fc8096183f8Mike Stump      ?         // expected-warning {{will never be executed}}
89e5fba7058ce34cc3d75e16e777ec6fc8096183f8Mike Stump      dead() : dead();
9044582300b63ac128989643adcd12b6349b67abe4Mike Stump  case 10:
9144582300b63ac128989643adcd12b6349b67abe4Mike Stump    (           // expected-warning {{will never be executed}}
9244582300b63ac128989643adcd12b6349b67abe4Mike Stump      float)halt();
93b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump  case 11: {
94b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump    int a[5];
95b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump    live(),
960c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek      a[halt()  // expected-warning {{will never be executed}}
970c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek        ];
98b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump  }
998eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump  }
1008eae0907c5094b8af61e26b8b809baf3c1ba75c8Mike Stump}
1018caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek
1028caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenekenum Cases { C1, C2, C3 };
1038caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenekint test_enum_cases(enum Cases C) {
1048caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek  switch (C) {
1058caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek    case C1:
1068caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek    case C2:
1078caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek    case C3:
1088caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek      return 1;
1098caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek    default: {
1108caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek      int i = 0; // expected-warning{{will never be executed}}
1118caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek      ++i;
1128caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek      return i;
1138caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek    }
1148caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek  }
1158caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek}
1168caec849a765de7b0b4ae8b9769397ce62236321Ted Kremenek
117e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek// Handle unreachable code triggered by macro expansions.
118e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenekvoid __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
119e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek
120e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek#define myassert(e) \
121e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek    (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
122e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek
123e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenekvoid test_assert() {
124e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek  myassert(0 && "unreachable");
125e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek  return; // no-warning
126e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek}
127e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek
128952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenek// Test case for PR 9774.  Tests that dead code in macros aren't warned about.
129952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenek#define MY_MAX(a,b)     ((a) >= (b) ? (a) : (b))
130952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenekvoid PR9774(int *s) {
131952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenek    for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
132952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenek        s[i] = 0;
133952b35dc07d5c77592a1b6bd54257511fcdb1ca9Ted Kremenek}
134e7a2764b2c98859aa42a3fd36d55cd34c7fe883eTed Kremenek
135