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