brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 4071279 Raw
245 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3struct A {};4struct B {5  void foo(int b) {6    switch (a) { // expected-error{{use of undeclared identifier 'a'}}7    default:8      return;9    }10    11    switch (b) {12    case 17 // expected-error{{expected ':' after 'case'}}13      break;14 15    default // expected-error{{expected ':' after 'default'}}16      return;17    }18  }19 20  void test2() {21    enum X { Xa, Xb } x;22 23    switch (x) { // expected-warning {{enumeration value 'Xb' not handled in switch}}24    case Xa; // expected-error {{expected ':' after 'case'}}25      break;26    }27 28    switch (x) {29    default; // expected-error {{expected ':' after 'default'}}30      break;31    }32  }33 34  int test3(int i) {35    switch (i) {36      case 1: return 0;37      2: return 1;  // expected-error {{expected 'case' keyword before expression}}38      default: return 5;39    }40  }41};42 43int test4(int i) {44  switch (i)45    1: return -1;  // expected-error {{expected 'case' keyword before expression}}46  return 0;47}48 49int test5(int i) {50  switch (i) {51    case 1: case 2: case 3: return 1;52    {53    4:5:6:7: return 2;  // expected-error 4{{expected 'case' keyword before expression}}54    }55    default: return -1;56  }57}58 59int test6(int i) {60  switch (i) {61    case 1:62    case 4:63      // This class provides extra single colon tokens.  Make sure no64      // errors are seen here.65      class foo{66        public:67        protected:68        private:69      };70    case 2:71    5:  // expected-error {{expected 'case' keyword before expression}}72    default: return 1;73  }74}75 76int test7(int i) {77  switch (i) {78    case false ? 1 : 2:79    true ? 1 : 2:  // expected-error {{expected 'case' keyword before expression}}80    case 10:81      14 ? 3 : 4;  // expected-warning {{expression result unused}}82    default:83      return 1;84  }85}86 87enum foo { A, B, C};88int test8( foo x ) {89  switch (x) {90    A: return 0;  // FIXME: give a warning for unused labels that could also be91                  // a case expression.92    default: return 1;93  }94}95 96// Stress test to make sure Clang doesn't crash.97void test9(int x) { // expected-note {{'x' declared here}}98  switch(x) {99    case 1: return;100    2: case; // expected-error {{expected 'case' keyword before expression}} \101                expected-error {{expected expression}}102    4:5:6: return; // expected-error 3{{expected 'case' keyword before expression}}103    7: :x; // expected-error {{expected 'case' keyword before expression}} \104              expected-error {{expected expression}}105    8:: x; // expected-error {{expected ';' after expression}} \106              expected-error {{no member named 'x' in the global namespace; did you mean simply 'x'?}} \107              expected-warning 2 {{expression result unused}}108    9:: :y; // expected-error {{expected ';' after expression}} \109               expected-error {{expected unqualified-id}} \110               expected-warning {{expression result unused}}111    :; // expected-error {{expected expression}}112    ::; // expected-error {{expected unqualified-id}}113  }114}115 116void test10(int x) {117  switch (x) {118    case 1: {119      struct Inner {120        void g(int y) {121          2: y++;  // expected-error {{expected ';' after expression}} \122                   // expected-warning {{expression result unused}}123        }124      };125      break;126    }127  }128}129 130template<typename T>131struct test11 {132  enum { E };133 134  void f(int x) {135    switch (x) {136      E: break;    // FIXME: give a 'case' fix-it for unused labels that137                   // could also be an expression an a case label.138      E+1: break;  // expected-error {{expected 'case' keyword before expression}}139    }140  }141};142 143void test12(int x) {144  switch (x) {145    0:  // expected-error {{expected 'case' keyword before expression}}146    while (x) {147      1:  // expected-error {{expected 'case' keyword before expression}}148      for (;x;) {149        2:  // expected-error {{expected 'case' keyword before expression}}150        if (x > 0) {151          3:  // expected-error {{expected 'case' keyword before expression}}152          --x;153        }154      }155    }156  }157}158 159void missing_statement_case(int x) {160  switch (x) {161    case 1:162    case 0:163  } // expected-warning {{label at end of compound statement is a C++23 extension}}164}165 166void missing_statement_default(int x) {167  switch (x) {168    case 0:169    default:170  } // expected-warning {{label at end of compound statement is a C++23 extension}}171}172 173void pr19022_1() {174  switch (int x)  // expected-error {{variable declaration in condition must have an initializer}}175  case v: ;  // expected-error {{use of undeclared identifier 'v'}}176}177 178void pr19022_1a(int x) {179  switch(x) {180  case 1  // expected-error{{expected ':' after 'case'}}181  } // expected-warning {{label at end of compound statement is a C++23 extension}}182}183 184void pr19022_1b(int x) {185  switch(x) {186  case v  // expected-error{{use of undeclared identifier 'v'}} \187          // expected-error{{expected ':' after 'case'}}188  } // expected-error{{expected statement}}189 }190 191void pr19022_2() {192  switch (int x)  // expected-error {{variable declaration in condition must have an initializer}}193  case v1: case v2: ;  // expected-error {{use of undeclared identifier 'v1'}} \194                       // expected-error {{use of undeclared identifier 'v2'}}195}196 197void pr19022_3(int x) {198  switch (x)199  case 1: case v2: ;  // expected-error {{use of undeclared identifier 'v2'}}200}201 202int pr19022_4(int x) {203  switch(x) {204  case 1  // expected-error{{expected ':' after 'case'}} expected-note{{previous case defined here}}205  case 1 : return x;  // expected-error{{duplicate case value '1'}}206  }207}208 209void pr19022_5(int x) {210  switch(x) {211  case 1: case // expected-error{{expected ':' after 'case'}}212  }  // expected-error{{expected expression}} \213     // expected-warning {{label at end of compound statement is a C++23 extension}}214}215 216namespace pr19022 {217int baz5() {}218bool bar0() {219  switch (int foo0)  //expected-error{{variable declaration in condition must have an initializer}}220  case bar5: ;  // expected-error{{use of undeclared identifier 'bar5'}}221}222}223 224namespace pr21841 {225void fn1() {226  switch (0)227    switch (0  // expected-note{{to match this '('}}228    {  // expected-error{{expected ')'}}229    }230} // expected-error{{expected statement}}231}232 233namespace GH143216 {234#define FOO 1 case 3:235 236int f(int x) {237  switch (x) {238  case FOO // expected-error {{expected ':' after 'case'}}239    return 0;240  default:241    return 1;242  }243}244}245