Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default
      2 
      3 int halt() __attribute__((noreturn));
      4 int live();
      5 int dead();
      6 
      7 void 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 
     26 void 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
     84       +=        // expected-warning {{will never be executed}}
     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()
     97         ];      // expected-warning {{will never be executed}}
     98   }
     99   }
    100 }
    101 
    102 enum Cases { C1, C2, C3 };
    103 int 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.
    118 void __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 
    123 void 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))
    130 void PR9774(int *s) {
    131     for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning
    132         s[i] = 0;
    133 }
    134 
    135 // Test case for <rdar://problem/11005770>.  We should treat code guarded
    136 // by 'x & 0' and 'x * 0' as unreachable.
    137 void calledFun();
    138 void test_mul_and_zero(int x) {
    139   if (x & 0) calledFun(); // expected-warning {{will never be executed}}
    140   if (0 & x) calledFun(); // expected-warning {{will never be executed}}
    141   if (x * 0) calledFun(); // expected-warning {{will never be executed}}
    142   if (0 * x) calledFun(); // expected-warning {{will never be executed}}
    143 }
    144