From: Rico Tzschichholz Date: Tue, 2 Nov 2021 12:22:00 +0000 (+0100) Subject: parser: Better handling of misplaced switch sections X-Git-Tag: 0.48.20~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6cd307cad1a42fa9c47717b98825d0c1cb5d602;p=thirdparty%2Fvala.git parser: Better handling of misplaced switch sections Fixes https://gitlab.gnome.org/GNOME/vala/issues/1246 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 0ae4634a9..86e5e378f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -884,6 +884,7 @@ TESTS = \ parser/signal-no-static.test \ parser/statement-outside-root.test \ parser/switch-statement.vala \ + parser/switch-section-outside-switch.test \ parser/template.vala \ parser/tuple.vala \ parser/unsupported-property-async.test \ diff --git a/tests/parser/switch-section-outside-switch.test b/tests/parser/switch-section-outside-switch.test new file mode 100644 index 000000000..8a888d83c --- /dev/null +++ b/tests/parser/switch-section-outside-switch.test @@ -0,0 +1,5 @@ +Invalid Code + +void main () { + case 23: +} diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 9c69fe3f3..d2e42321a 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -1577,8 +1577,6 @@ public class Vala.Parser : CodeVisitor { void parse_statements (Block block) throws ParseError { while (current () != TokenType.CLOSE_BRACE - && current () != TokenType.CASE - && current () != TokenType.DEFAULT && current () != TokenType.EOF) { try { Statement stmt = null; @@ -1598,6 +1596,15 @@ public class Vala.Parser : CodeVisitor { case TokenType.SWITCH: stmt = parse_switch_statement (); break; + case TokenType.CASE: + case TokenType.DEFAULT: + if (block is SwitchSection) { + // begin a new switch case + return; + } else { + stmt = parse_switch_section_statement (); + } + break; case TokenType.WHILE: stmt = parse_while_statement (); break; diff --git a/vala/valaswitchsection.vala b/vala/valaswitchsection.vala index af5be68dc..a44256b85 100644 --- a/vala/valaswitchsection.vala +++ b/vala/valaswitchsection.vala @@ -88,6 +88,12 @@ public class Vala.SwitchSection : Block { return !error; } + if (!(parent_node is SwitchStatement)) { + Report.error (source_reference, "no enclosing switch statement found"); + error = true; + return false; + } + foreach (SwitchLabel label in get_labels ()) { label.check (context); }