From 9a35167f7091a4a18900c07f75ab6fe3db8ae959 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Mon, 15 Aug 2022 08:36:49 +0200 Subject: vala: Make try-statement parsing more resilient Regression of f5934184d050d1a19f394fdab6f2ee66ff30965f Fixes https://gitlab.gnome.org/GNOME/vala/issues/1304 --- tests/Makefile.am | 1 + tests/parser/try-catch-in-switch-case-invalid.test | 16 ++++++++++++++++ vala/valaparser.vala | 4 +++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/parser/try-catch-in-switch-case-invalid.test diff --git a/tests/Makefile.am b/tests/Makefile.am index f5e0cb8ff..147c66676 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -994,6 +994,7 @@ TESTS = \ parser/switch-statement.vala \ parser/switch-section-outside-switch.test \ parser/template.vala \ + parser/try-catch-in-switch-case-invalid.test \ parser/tuple.vala \ parser/unsupported-property-async.test \ parser/unsupported-property-throws.test \ diff --git a/tests/parser/try-catch-in-switch-case-invalid.test b/tests/parser/try-catch-in-switch-case-invalid.test new file mode 100644 index 000000000..1d67e569c --- /dev/null +++ b/tests/parser/try-catch-in-switch-case-invalid.test @@ -0,0 +1,16 @@ +Invalid Code + +void main () { + switch (42) { + case 42: + try { + GLib.print ("42"); + catch (GLib.Error e) { + debug ("foo"); + } + break; + default: + debug ("bar"); + break; + } +} diff --git a/vala/valaparser.vala b/vala/valaparser.vala index cfa0776ae..f703e9c86 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -2473,8 +2473,10 @@ public class Vala.Parser : CodeVisitor { if (current () == TokenType.FINALLY) { finally_clause = parse_finally_clause (); } - } else { + } else if (current () == TokenType.FINALLY) { finally_clause = parse_finally_clause (); + } else { + report_parse_error (new ParseError.SYNTAX ("expected `catch' or `finally'")); } var stmt = new TryStatement (try_block, finally_clause, get_src (begin)); foreach (CatchClause clause in catch_clauses) { -- cgit v1.2.1