From 17d539496f5adc37c34a4f979978114c9397d234 Mon Sep 17 00:00:00 2001 From: steven Date: Mon, 18 Sep 2006 15:32:43 +0000 Subject: [PATCH] PR c++/29087 * parser.c (cp_parser_labeled_statement): Return nothing. Do not take in_statement_expr and in_compound as arguments. Rename to cp_parser_label_for_labeled_statement. Parse only the label, not the statement. (cp_parser_statement): Parse the statement of a labeled-statement from here, using tail recursion. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117026 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/parser.c | 61 ++++++++++++++++++++++++++------------------------------ 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1123643c893..a5d403a600f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2006-09-18 Steven Bosscher + + PR c++/29087 + * parser.c (cp_parser_labeled_statement): Return nothing. Do + not take in_statement_expr and in_compound as arguments. Rename + to cp_parser_label_for_labeled_statement. Parse only the label, + not the statement. + (cp_parser_statement): Parse the statement of a labeled-statement + from here, using tail recursion. + 2006-09-14 Andrew Pinski PR C++/29002 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index af4f312a036..d0205208eb3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1451,8 +1451,8 @@ static tree cp_parser_builtin_offsetof static void cp_parser_statement (cp_parser *, tree, bool); -static tree cp_parser_labeled_statement - (cp_parser *, tree, bool); +static void cp_parser_label_for_labeled_statement + (cp_parser *); static tree cp_parser_expression_statement (cp_parser *, tree); static tree cp_parser_compound_statement @@ -6117,9 +6117,11 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, { case RID_CASE: case RID_DEFAULT: - statement = cp_parser_labeled_statement (parser, in_statement_expr, - in_compound); - break; + /* Looks like a labeled-statement with a case label. + Parse the label, and then use tail recursion to parse + the statement. */ + cp_parser_label_for_labeled_statement (parser); + goto restart; case RID_IF: case RID_SWITCH: @@ -6164,8 +6166,13 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, labeled-statement. */ token = cp_lexer_peek_nth_token (parser->lexer, 2); if (token->type == CPP_COLON) - statement = cp_parser_labeled_statement (parser, in_statement_expr, - in_compound); + { + /* Looks like a labeled-statement with an ordinary label. + Parse the label, and then use tail recursion to parse + the statement. */ + cp_parser_label_for_labeled_statement (parser); + goto restart; + } } /* Anything that starts with a `{' must be a compound-statement. */ else if (token->type == CPP_OPEN_BRACE) @@ -6215,30 +6222,23 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, SET_EXPR_LOCATION (statement, statement_location); } -/* Parse a labeled-statement. +/* Parse the label for a labeled-statement, i.e. - labeled-statement: - identifier : statement - case constant-expression : statement - default : statement + identifier : + case constant-expression : + default : GNU Extension: + case constant-expression ... constant-expression : statement - labeled-statement: - case constant-expression ... constant-expression : statement - - Returns the new CASE_LABEL_EXPR, for a `case' or `default' label. - For an ordinary label, returns a LABEL_EXPR. - - IN_COMPOUND is as for cp_parser_statement: true when we're nested - inside a compound. */ + When a label is parsed without errors, the label is added to the + parse tree by the finish_* functions, so this function doesn't + have to return the label. */ -static tree -cp_parser_labeled_statement (cp_parser* parser, tree in_statement_expr, - bool in_compound) +static void +cp_parser_label_for_labeled_statement (cp_parser* parser) { cp_token *token; - tree statement = error_mark_node; /* The next token should be an identifier. */ token = cp_lexer_peek_token (parser->lexer); @@ -6246,7 +6246,7 @@ cp_parser_labeled_statement (cp_parser* parser, tree in_statement_expr, && token->type != CPP_KEYWORD) { cp_parser_error (parser, "expected labeled-statement"); - return error_mark_node; + return; } switch (token->keyword) @@ -6279,7 +6279,7 @@ cp_parser_labeled_statement (cp_parser* parser, tree in_statement_expr, expr_hi = NULL_TREE; if (parser->in_switch_statement_p) - statement = finish_case_label (expr, expr_hi); + finish_case_label (expr, expr_hi); else error ("case label %qE not within a switch statement", expr); } @@ -6290,24 +6290,19 @@ cp_parser_labeled_statement (cp_parser* parser, tree in_statement_expr, cp_lexer_consume_token (parser->lexer); if (parser->in_switch_statement_p) - statement = finish_case_label (NULL_TREE, NULL_TREE); + finish_case_label (NULL_TREE, NULL_TREE); else error ("case label not within a switch statement"); break; default: /* Anything else must be an ordinary label. */ - statement = finish_label_stmt (cp_parser_identifier (parser)); + finish_label_stmt (cp_parser_identifier (parser)); break; } /* Require the `:' token. */ cp_parser_require (parser, CPP_COLON, "`:'"); - /* Parse the labeled statement. */ - cp_parser_statement (parser, in_statement_expr, in_compound); - - /* Return the label, in the case of a `case' or `default' label. */ - return statement; } /* Parse an expression-statement. -- 2.11.4.GIT