diff options
| author | Richard Trieu <rtrieu@google.com> | 2011-04-21 21:44:26 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2011-04-21 21:44:26 +0000 |
| commit | 2c850c09801b9d21bf2108c66d59cd542183f95e (patch) | |
| tree | 9efa5462cb59379f27cfc9e699e15811c54f9dab /clang/test/Parser/switch-recovery.cpp | |
| parent | 2048ea5eba051482f04049953fecccb34427c79d (diff) | |
| download | bcm5719-llvm-2c850c09801b9d21bf2108c66d59cd542183f95e.tar.gz bcm5719-llvm-2c850c09801b9d21bf2108c66d59cd542183f95e.zip | |
Add a fixit suggest for missing case keywords inside a switch scope. For instance, in the following code, 'case ' will be suggested before the '1:'
switch (x) {
1: return 0;
default: return 1;
}
llvm-svn: 129943
Diffstat (limited to 'clang/test/Parser/switch-recovery.cpp')
| -rw-r--r-- | clang/test/Parser/switch-recovery.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/clang/test/Parser/switch-recovery.cpp b/clang/test/Parser/switch-recovery.cpp index f11babc5b60..0e4dcfa3c63 100644 --- a/clang/test/Parser/switch-recovery.cpp +++ b/clang/test/Parser/switch-recovery.cpp @@ -31,4 +31,128 @@ struct B { 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; + 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) { + 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}} \ + 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; + } + } + } + } +} |

