Forbid declarations after label, case and default statements.
authorChristoph Mallon <christoph.mallon@gmx.de>
Sun, 24 Aug 2008 10:43:21 +0000 (10:43 +0000)
committerChristoph Mallon <christoph.mallon@gmx.de>
Sun, 24 Aug 2008 10:43:21 +0000 (10:43 +0000)
[r21400]

TODO
parser.c

diff --git a/TODO b/TODO
index a450925..56c6868 100644 (file)
--- a/TODO
+++ b/TODO
@@ -30,7 +30,6 @@ ast2firm:
 - merge functions entities declared in lokal scope
 
 Missing Errors:
-- label: declaration; is no valid C99 but we parse it anyway
 - check switches for double cases
 
 Missing Warnings:
index b9235f1..44ec3f3 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -7692,7 +7692,12 @@ static statement_t *parse_case_statement(void)
                               "case label not within a switch statement");
                }
        }
-       statement->case_label.statement = parse_statement();
+
+       statement_t *const inner_stmt = parse_statement();
+       statement->case_label.statement = inner_stmt;
+       if (inner_stmt->kind == STATEMENT_DECLARATION) {
+               errorf(&inner_stmt->base.source_position, "declaration after case label");
+       }
 
        return statement;
 end_error:
@@ -7743,7 +7748,12 @@ static statement_t *parse_default_statement(void)
                errorf(&statement->base.source_position,
                        "'default' label not within a switch statement");
        }
-       statement->case_label.statement = parse_statement();
+
+       statement_t *const inner_stmt = parse_statement();
+       statement->case_label.statement = inner_stmt;
+       if (inner_stmt->kind == STATEMENT_DECLARATION) {
+               errorf(&inner_stmt->base.source_position, "declaration after default label");
+       }
 
        return statement;
 end_error:
@@ -7819,7 +7829,11 @@ static statement_t *parse_label_statement(void)
                statement->label.statement = create_empty_statement();
                next_token();
        } else {
-               statement->label.statement = parse_statement();
+               statement_t *const inner_stmt = parse_statement();
+               statement->label.statement = inner_stmt;
+               if (inner_stmt->kind == STATEMENT_DECLARATION) {
+                       errorf(&inner_stmt->base.source_position, "declaration after label");
+               }
        }
 
        /* remember the labels in a list for later checking */