Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 
      3 void a(int i);
      4 int b();
      5 int c();
      6 
      7 void test1(int x, int y) {
      8   while(true) {
      9     if (x); // expected-warning {{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     10 
     11     int i;
     12     // PR11329
     13     for (i = 0; i < x; i++); { // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     14       a(i);
     15       b();
     16     }
     17 
     18     for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     19     {
     20       a(i);
     21     }
     22 
     23     for (i = 0;
     24          i < x;
     25          i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     26     {
     27       a(i);
     28     }
     29 
     30     int arr[3] = { 1, 2, 3 };
     31     for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     32       a(i);
     33 
     34     for (int j :
     35          arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     36       a(i);
     37 
     38     while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     39       a(i);
     40 
     41     while (b() == 0); { // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     42       a(i);
     43     }
     44 
     45     while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     46     {
     47       a(i);
     48     }
     49 
     50     while (b() == 0 ||
     51            c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     52     {
     53       a(i);
     54     }
     55 
     56     do;          // expected-note{{to match this 'do'}}
     57       b();       // expected-error{{expected 'while' in do/while loop}}
     58     while (b()); // no-warning
     59     c();
     60 
     61     do;          // expected-note{{to match this 'do'}}
     62       b();       // expected-error{{expected 'while' in do/while loop}}
     63     while (b()); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     64       c();
     65 
     66     switch(x) // no-warning
     67     {
     68       switch(y); // expected-warning{{switch statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
     69       {
     70         case 0:
     71           a(10);
     72           break;
     73         default:
     74           a(20);
     75           break;
     76       }
     77     }
     78   }
     79 }
     80 
     81 /// There should be no warning  when null statement is placed on its own line.
     82 void test2(int x, int y) {
     83   if (x) // no-warning
     84     ; // no-warning
     85 
     86   int i;
     87   for (i = 0; i < x; i++) // no-warning
     88     ; // no-warning
     89 
     90   for (i = 0;
     91        i < x;
     92        i++) // no-warning
     93     ; // no-warning
     94 
     95   int arr[3] = { 1, 2, 3 };
     96   for (int j : arr) // no-warning
     97     ; // no-warning
     98 
     99   while (b() == 0) // no-warning
    100     ; // no-warning
    101 
    102   while (b() == 0 ||
    103          c() == 0) // no-warning
    104     ; // no-warning
    105 
    106   switch(x)
    107   {
    108     switch(y) // no-warning
    109       ; // no-warning
    110   }
    111 
    112   // Last `for' or `while' statement in compound statement shouldn't warn.
    113   while(b() == 0); // no-warning
    114 }
    115 
    116 /// There should be no warning for a null statement resulting from an empty macro.
    117 #define EMPTY(a)
    118 void test3(int x, int y) {
    119   if (x) EMPTY(x); // no-warning
    120 
    121   int i;
    122   for (i = 0; i < x; i++) EMPTY(i); // no-warning
    123 
    124   for (i = 0;
    125        i < x;
    126        i++) EMPTY(i); // no-warning
    127 
    128   int arr[3] = { 1, 2, 3 };
    129   for (int j : arr) EMPTY(j); // no-warning
    130 
    131   for (int j :
    132        arr) EMPTY(j); // no-warning
    133 
    134   while (b() == 0) EMPTY(i); // no-warning
    135 
    136   while (b() == 0 ||
    137          c() == 0) EMPTY(i); // no-warning
    138 
    139   switch (x) {
    140     switch (y)
    141       EMPTY(i); // no-warning
    142   }
    143 }
    144 
    145 void test4(int x)
    146 {
    147   // Idiom used in some metaprogramming constructs.
    148   switch (x) default:; // no-warning
    149 
    150   // Frequent idiom used in macros.
    151   do {} while (false); // no-warning
    152 }
    153 
    154 /// There should be no warning for a common for/while idiom when it is obvious
    155 /// from indentation that next statement wasn't meant to be a body.
    156 void test5(int x, int y) {
    157   int i;
    158   for (i = 0; i < x; i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    159     a(i);
    160 
    161   for (i = 0; i < x; i++); // no-warning
    162   a(i);
    163 
    164   for (i = 0;
    165        i < x;
    166        i++); // expected-warning{{for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    167     a(i);
    168 
    169   for (i = 0;
    170        i < x;
    171        i++); // no-warning
    172   a(i);
    173 
    174   while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    175     a(i);
    176 
    177   while (b() == 0); // no-warning
    178   a(i);
    179 
    180   while (b() == 0 ||
    181          c() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    182     a(i);
    183 
    184   while (b() == 0 ||
    185          c() == 0); // no-warning
    186   a(i);
    187 }
    188 
    189 /// There should be no warning for a statement with a non-null body.
    190 void test6(int x, int y) {
    191   if (x) {} // no-warning
    192 
    193   if (x)
    194     a(x); // no-warning
    195 
    196   int i;
    197   for (i = 0; i < x; i++) // no-warning
    198     a(i); // no-warning
    199 
    200   for (i = 0; i < x; i++) { // no-warning
    201     a(i); // no-warning
    202   }
    203 
    204   for (i = 0;
    205        i < x;
    206        i++) // no-warning
    207     a(i); // no-warning
    208 
    209   int arr[3] = { 1, 2, 3 };
    210   for (int j : arr) // no-warning
    211     a(j);
    212 
    213   for (int j : arr) {} // no-warning
    214 
    215   while (b() == 0) // no-warning
    216     a(i); // no-warning
    217 
    218   while (b() == 0) {} // no-warning
    219 
    220   switch(x) // no-warning
    221   {
    222     switch(y) // no-warning
    223     {
    224       case 0:
    225         a(10);
    226         break;
    227       default:
    228         a(20);
    229         break;
    230     }
    231   }
    232 }
    233 
    234 void test_errors(int x) {
    235   if (1)
    236     aa; // expected-error{{use of undeclared identifier}}
    237         // no empty body warning.
    238 
    239   int i;
    240   for (i = 0; i < x; i++)
    241     bb; // expected-error{{use of undeclared identifier}}
    242 
    243   int arr[3] = { 1, 2, 3 };
    244   for (int j : arr)
    245     cc; // expected-error{{use of undeclared identifier}}
    246 
    247   while (b() == 0)
    248     dd; // expected-error{{use of undeclared identifier}}
    249 }
    250 
    251 // Warnings for statements in templates shouldn't be duplicated for all
    252 // instantiations.
    253 template <typename T>
    254 void test_template(int x) {
    255   if (x); // expected-warning{{if statement has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    256 
    257   if (x)
    258     EMPTY(x); // no-warning
    259 
    260   int arr[3] = { 1, 2, 3 };
    261   for (int j : arr); // expected-warning{{range-based for loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    262 
    263   while (b() == 0); // expected-warning{{while loop has empty body}} expected-note{{put the semicolon on a separate line to silence this warning}}
    264     a(x);
    265 }
    266 
    267 void test_template_inst(int x) {
    268   test_template<int>(x);
    269   test_template<double>(x);
    270 }
    271 
    272 #define IDENTITY(a) a
    273 void test7(int x, int y) {
    274   if (x) IDENTITY(); // no-warning
    275 }
    276 
    277