diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-18 19:42:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-18 19:42:37 +0000 |
commit | 366920a45e3e278d35cbc3bc74d9d0676ae87dfe (patch) | |
tree | 44e5b4e59df2569b04da38f7427aea23e7ca5131 | |
parent | 5718a351b3da578366ec6f07670ca33b7d9726a3 (diff) |
first step to getting switches giving "jump into vla scope" errors.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69461 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 9 | ||||
-rw-r--r-- | test/Sema/scope-check.c | 11 |
3 files changed, 20 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index bf2ff2dd45..9560614058 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -832,6 +832,8 @@ def err_redefinition_of_label : Error<"redefinition of label '%0'">; def err_undeclared_label_use : Error<"use of undeclared label '%0'">; def err_goto_into_protected_scope : Error<"illegal goto into protected scope">; +def err_switch_into_protected_scope : Error< + "illegal switch into protected scope">; def note_protected_by_vla_typedef : Note< "jump bypasses initialization of VLA typedef">; def note_protected_by_vla : Note< diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 772db3b247..48351407d9 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3070,8 +3070,13 @@ void JumpScopeChecker::VerifyJumps() { assert(LabelAndGotoScopes.count(GS->getLabel()) && "Label not visited?"); CheckJump(GS, LabelAndGotoScopes[GS->getLabel()], diag::err_goto_into_protected_scope); - } else if (isa<SwitchStmt>(Jump)) { - // FIXME: Handle this. + } else if (SwitchStmt *SS = dyn_cast<SwitchStmt>(Jump)) { + for (SwitchCase *SC = SS->getSwitchCaseList(); SC; + SC = SC->getNextSwitchCase()) { + assert(LabelAndGotoScopes.count(SC) && "Case not visited?"); + CheckJump(SS, LabelAndGotoScopes[SC], + diag::err_switch_into_protected_scope); + } continue; } else { assert(isa<IndirectGotoStmt>(Jump)); diff --git a/test/Sema/scope-check.c b/test/Sema/scope-check.c index 4c3480ea27..59d4d134a8 100644 --- a/test/Sema/scope-check.c +++ b/test/Sema/scope-check.c @@ -46,5 +46,16 @@ int test6() { goto x; // expected-error {{use of undeclared label 'x'}} } +void test7(int x) { +foo: + switch (x) { // expected-error {{illegal switch into protected scope}} + case 1: ; + int a[x]; // expected-note {{jump bypasses initialization of variable length array}} + case 2: + a[1] = 2; + break; + } +} + // FIXME: Switch cases etc. |