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