llvm-project/clang/test/Parser/switch-recovery.cpp

234 lines
6.1 KiB
C++
Raw Normal View History

// RUN: %clang_cc1 -fsyntax-only -verify %s
// <rdar://problem/7971948>
struct A {};
struct B {
void foo(int b) {
switch (a) { // expected-error{{use of undeclared identifier 'a'}}
default:
return;
}
switch (b) {
case 17 // expected-error{{expected ':' after 'case'}}
break;
default // expected-error{{expected ':' after 'default'}}
return;
}
}
void test2() {
enum X { Xa, Xb } x;
switch (x) { // expected-warning {{enumeration value 'Xb' not handled in switch}}
case Xa; // expected-error {{expected ':' after 'case'}}
break;
}
switch (x) {
default; // expected-error {{expected ':' after 'default'}}
break;
}
}
int test3(int i) {
switch (i) {
case 1: return 0;
2: return 1; // expected-error {{expected 'case' keyword before expression}}
default: return 5;
}
}
};
int test4(int i) {
switch (i)
1: return -1; // expected-error {{expected 'case' keyword before expression}}
return 0;
}
int test5(int i) {
switch (i) {
case 1: case 2: case 3: return 1;
{
4:5:6:7: return 2; // expected-error 4{{expected 'case' keyword before expression}}
}
default: return -1;
}
}
int test6(int i) {
switch (i) {
case 1:
case 4:
// This class provides extra single colon tokens. Make sure no
// errors are seen here.
class foo{
public:
protected:
private:
};
case 2:
5: // expected-error {{expected 'case' keyword before expression}}
default: return 1;
}
}
int test7(int i) {
switch (i) {
case false ? 1 : 2:
true ? 1 : 2: // expected-error {{expected 'case' keyword before expression}}
case 10:
14 ? 3 : 4; // expected-warning {{expression result unused}}
default:
return 1;
}
}
enum foo { A, B, C};
int test8( foo x ) {
switch (x) {
A: return 0; // FIXME: give a warning for unused labels that could also be
// a case expression.
default: return 1;
}
}
// Stress test to make sure Clang doesn't crash.
void test9(int x) { // expected-note {{'x' declared here}}
switch(x) {
case 1: return;
2: case; // expected-error {{expected 'case' keyword before expression}} \
expected-error {{expected expression}}
4:5:6: return; // expected-error 3{{expected 'case' keyword before expression}}
7: :x; // expected-error {{expected 'case' keyword before expression}} \
expected-error {{expected expression}}
8:: x; // expected-error {{expected ';' after expression}} \
expected-error {{no member named 'x' in the global namespace; did you mean simply 'x'?}} \
expected-warning {{expression result unused}}
9:: :y; // expected-error {{expected ';' after expression}} \
expected-error {{expected unqualified-id}} \
expected-warning {{expression result unused}}
:; // expected-error {{expected expression}}
::; // expected-error {{expected unqualified-id}}
}
}
void test10(int x) {
switch (x) {
case 1: {
struct Inner {
void g(int y) {
2: y++; // expected-error {{expected ';' after expression}} \
// expected-warning {{expression result unused}}
}
};
break;
}
}
}
template<typename T>
struct test11 {
enum { E };
void f(int x) {
switch (x) {
E: break; // FIXME: give a 'case' fix-it for unused labels that
// could also be an expression an a case label.
E+1: break; // expected-error {{expected 'case' keyword before expression}}
}
}
};
void test12(int x) {
switch (x) {
0: // expected-error {{expected 'case' keyword before expression}}
while (x) {
1: // expected-error {{expected 'case' keyword before expression}}
for (;x;) {
2: // expected-error {{expected 'case' keyword before expression}}
if (x > 0) {
3: // expected-error {{expected 'case' keyword before expression}}
--x;
}
}
}
}
}
void missing_statement_case(int x) {
switch (x) {
case 1:
case 0: // expected-error {{label at end of compound statement: expected statement}}
}
}
void missing_statement_default(int x) {
switch (x) {
case 0:
default: // expected-error {{label at end of compound statement: expected statement}}
}
}
void pr19022_1() {
switch (int x) // expected-error {{variable declaration in condition must have an initializer}}
case v: ; // expected-error {{use of undeclared identifier 'v'}}
}
void pr19022_1a(int x) {
switch(x) {
case 1 // expected-error{{expected ':' after 'case'}} \
// expected-error{{label at end of compound statement: expected statement}}
}
}
void pr19022_1b(int x) {
switch(x) {
case v // expected-error{{use of undeclared identifier 'v'}} \
// expected-error{{expected ':' after 'case'}}
} // expected-error{{expected statement}}
}
void pr19022_2() {
switch (int x) // expected-error {{variable declaration in condition must have an initializer}}
case v1: case v2: ; // expected-error {{use of undeclared identifier 'v1'}} \
// expected-error {{use of undeclared identifier 'v2'}}
}
void pr19022_3(int x) {
switch (x)
case 1: case v2: ; // expected-error {{use of undeclared identifier 'v2'}}
}
int pr19022_4(int x) {
switch(x) {
case 1 // expected-error{{expected ':' after 'case'}} expected-note{{previous case defined here}}
case 1 : return x; // expected-error{{duplicate case value '1'}}
}
}
void pr19022_5(int x) {
switch(x) {
case 1: case // expected-error{{expected ':' after 'case'}} \
// expected-error{{expected statement}}
} // expected-error{{expected expression}}
}
namespace pr19022 {
int baz5() {}
bool bar0() {
switch (int foo0) //expected-error{{variable declaration in condition must have an initializer}}
case bar5: ; // expected-error{{use of undeclared identifier 'bar5'}}
}
}
namespace pr21841 {
void fn1() {
switch (0)
switch (0 // expected-note{{to match this '('}}
{ // expected-error{{expected ')'}}
}
} // expected-error{{expected statement}}
}