]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
parser: Better handling of misplaced switch sections
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 2 Nov 2021 12:22:00 +0000 (13:22 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 14 Nov 2021 12:06:44 +0000 (13:06 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1246

tests/Makefile.am
tests/parser/switch-section-outside-switch.test [new file with mode: 0644]
vala/valaparser.vala
vala/valaswitchsection.vala

index 0ae4634a9ce2a2ebcc0b9e7cdd9e8a28318756f8..86e5e378fb0424e002bfb72e775496e140b03b63 100644 (file)
@@ -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 (file)
index 0000000..8a888d8
--- /dev/null
@@ -0,0 +1,5 @@
+Invalid Code
+
+void main () {
+       case 23:
+}
index 9c69fe3f3f5ec58cb608a531b52a02169c9235d6..d2e42321a06087ced2faa90ccd39934d30bdd1b7 100644 (file)
@@ -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;
index af5be68dc66ce246764ebdeef6162243cd7cdce4..a44256b85c658062f69ee0f2d8a6f6e5fb793dd8 100644 (file)
@@ -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);
                }