144 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default
 | |
| 
 | |
| int halt() __attribute__((noreturn));
 | |
| int live();
 | |
| int dead();
 | |
| 
 | |
| void test1() {
 | |
|   goto c;
 | |
|   d:
 | |
|   goto e;       // expected-warning {{will never be executed}}
 | |
|   c: ;
 | |
|   int i;
 | |
|   return;
 | |
|   goto b;        // expected-warning {{will never be executed}}
 | |
|   goto a;        // expected-warning {{will never be executed}}
 | |
|   b:
 | |
|   i = 1;
 | |
|   a:
 | |
|   i = 2;
 | |
|   goto f;
 | |
|   e:
 | |
|   goto d;
 | |
|   f: ;
 | |
| }
 | |
| 
 | |
| void test2() {
 | |
|   int i;
 | |
|   switch (live()) {
 | |
|   case 1:
 | |
|     halt(),
 | |
|       dead();   // expected-warning {{will never be executed}}
 | |
| 
 | |
|   case 2:
 | |
|     live(), halt(),
 | |
|       dead();   // expected-warning {{will never be executed}}
 | |
| 
 | |
|   case 3:
 | |
|   live()
 | |
|     +           // expected-warning {{will never be executed}}
 | |
|     halt();
 | |
|   dead();
 | |
| 
 | |
|   case 4:
 | |
|   a4:
 | |
|     live(),
 | |
|       halt();
 | |
|     goto a4;    // expected-warning {{will never be executed}}
 | |
| 
 | |
|   case 5:
 | |
|     goto a5;
 | |
|   c5:
 | |
|     dead();     // expected-warning {{will never be executed}}
 | |
|     goto b5;
 | |
|   a5:
 | |
|     live(),
 | |
|       halt();
 | |
|   b5:
 | |
|     goto c5;
 | |
| 
 | |
|   case 6:
 | |
|     if (live())
 | |
|       goto e6;
 | |
|     live(),
 | |
|       halt();
 | |
|   d6:
 | |
|     dead();     // expected-warning {{will never be executed}}
 | |
|     goto b6;
 | |
|   c6:
 | |
|     dead();
 | |
|     goto b6;
 | |
|   e6:
 | |
|     live(),
 | |
|       halt();
 | |
|   b6:
 | |
|     goto c6;
 | |
|   case 7:
 | |
|     halt()
 | |
|       +
 | |
|       dead();   // expected-warning {{will never be executed}}
 | |
|     -           // expected-warning {{will never be executed}}
 | |
|       halt();
 | |
|   case 8:
 | |
|     i
 | |
|       +=        // expected-warning {{will never be executed}}
 | |
|       halt();
 | |
|   case 9:
 | |
|     halt()
 | |
|       ?         // expected-warning {{will never be executed}}
 | |
|       dead() : dead();
 | |
|   case 10:
 | |
|     (           // expected-warning {{will never be executed}}
 | |
|       float)halt();
 | |
|   case 11: {
 | |
|     int a[5];
 | |
|     live(),
 | |
|       a[halt()
 | |
|         ];      // expected-warning {{will never be executed}}
 | |
|   }
 | |
|   }
 | |
| }
 | |
| 
 | |
| enum Cases { C1, C2, C3 };
 | |
| int test_enum_cases(enum Cases C) {
 | |
|   switch (C) {
 | |
|     case C1:
 | |
|     case C2:
 | |
|     case C3:
 | |
|       return 1;
 | |
|     default: {
 | |
|       int i = 0; // expected-warning{{will never be executed}}
 | |
|       ++i;
 | |
|       return i;
 | |
|     }
 | |
|   }  
 | |
| }
 | |
| 
 | |
| // Handle unreachable code triggered by macro expansions.
 | |
| void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__));
 | |
| 
 | |
| #define myassert(e) \
 | |
|     (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0)
 | |
| 
 | |
| void test_assert() {
 | |
|   myassert(0 && "unreachable");
 | |
|   return; // no-warning
 | |
| }
 | |
| 
 | |
| // Test case for PR 9774.  Tests that dead code in macros aren't warned about.
 | |
| #define MY_MAX(a,b)     ((a) >= (b) ? (a) : (b))
 | |
| void PR9774(int *s) {
 | |
|     for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
 | |
|         s[i] = 0;
 | |
| }
 | |
| 
 | |
| // Test case for <rdar://problem/11005770>.  We should treat code guarded
 | |
| // by 'x & 0' and 'x * 0' as unreachable.
 | |
| void calledFun();
 | |
| void test_mul_and_zero(int x) {
 | |
|   if (x & 0) calledFun(); // expected-warning {{will never be executed}}
 | |
|   if (0 & x) calledFun(); // expected-warning {{will never be executed}}
 | |
|   if (x * 0) calledFun(); // expected-warning {{will never be executed}}
 | |
|   if (0 * x) calledFun(); // expected-warning {{will never be executed}}
 | |
| }
 | 
