diff options
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/control-flow/switch-try-finally-throw.test | 24 | ||||
-rw-r--r-- | vala/valaflowanalyzer.vala | 5 |
3 files changed, 28 insertions, 2 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index c36f4aad3..3d4d7cff3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -285,6 +285,7 @@ TESTS = \ control-flow/pre-post-increment-property.vala \ control-flow/switch.vala \ control-flow/switch-string.vala \ + control-flow/switch-try-finally-throw.test \ control-flow/sideeffects.vala \ control-flow/unassigned-captured-local-variable.test \ control-flow/unassigned-local-block-variable.test \ diff --git a/tests/control-flow/switch-try-finally-throw.test b/tests/control-flow/switch-try-finally-throw.test new file mode 100644 index 000000000..1cf0ec796 --- /dev/null +++ b/tests/control-flow/switch-try-finally-throw.test @@ -0,0 +1,24 @@ +Invalid Code + +errordomain FooError { + FAIL +} + +void foo () throws FooError { +} + +void bar (int i) throws Error { + switch (i) { + case 23: + try { + } finally { + foo (); + } + break; + default: + throw new FooError.FAIL ("bar"); + } +} + +void main () { +} diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 03aae237f..86bb92aae 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -968,13 +968,14 @@ public class Vala.FlowAnalyzer : CodeVisitor { stmt.finally_body.accept (this); + jump_stack.remove_at (jump_stack.size - 1); + if (invalid_block.get_predecessors ().size > 0) { // don't allow finally blocks with e.g. return statements - Report.error (stmt.source_reference, "jump out of finally block not permitted"); + Report.error (stmt.finally_body.source_reference, "jump out of finally block not permitted"); stmt.error = true; return; } - jump_stack.remove_at (jump_stack.size - 1); jump_stack.add (new JumpTarget.finally_clause (finally_block, current_block)); } |