diff options
author | Jason Merrill <jason@redhat.com> | 2014-04-11 14:25:07 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-04-11 14:25:07 -0400 |
commit | 636201978b356a45b8626fc75fc63c8c2747dce5 (patch) | |
tree | 6b34df289fc064532af23c0051a77abf3efd7d70 | |
parent | 1c982d13138ee4518db10b6fbe02fa32d09ab51e (diff) | |
download | gcc-636201978b356a45b8626fc75fc63c8c2747dce5.zip gcc-636201978b356a45b8626fc75fc63c8c2747dce5.tar.gz gcc-636201978b356a45b8626fc75fc63c8c2747dce5.tar.bz2 |
parser.h (struct cp_token): Rename ambiguous_p to error_reported.
* parser.h (struct cp_token): Rename ambiguous_p to error_reported.
* parser.c: Adjust.
(cp_lexer_get_preprocessor_token): Always clear it.
(cp_parser_lambda_expression): Use it to avoid duplicate diagnostics.
From-SVN: r209315
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 22 | ||||
-rw-r--r-- | gcc/cp/parser.h | 8 |
3 files changed, 22 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a1cadeb..bf61ab7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2014-04-11 Jason Merrill <jason@redhat.com> + * parser.h (struct cp_token): Rename ambiguous_p to error_reported. + * parser.c: Adjust. + (cp_lexer_get_preprocessor_token): Always clear it. + (cp_parser_lambda_expression): Use it to avoid duplicate diagnostics. + DR 1467 PR c++/51747 * decl.c (reshape_init_r): Handle a single element of class type. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f386eed..bb59e3b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -762,6 +762,7 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token) token->keyword = RID_MAX; token->pragma_kind = PRAGMA_NONE; token->purged_p = false; + token->error_reported = false; /* On some systems, some header files are surrounded by an implicit extern "C" block. Set a flag in the token if it @@ -797,7 +798,6 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token) C_SET_RID_CODE (token->u.value, RID_MAX); } - token->ambiguous_p = false; token->keyword = RID_MAX; } } @@ -3011,7 +3011,7 @@ cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser) if (token->type == CPP_NESTED_NAME_SPECIFIER) { cp_token *next = cp_lexer_peek_nth_token (parser->lexer, 2); - if (next->type == CPP_NAME && next->ambiguous_p) + if (next->type == CPP_NAME && next->error_reported) goto out; } @@ -4535,7 +4535,7 @@ cp_parser_primary_expression (cp_parser *parser, we've already issued an error message; there's no reason to check again. */ if (id_expr_token->type == CPP_NAME - && id_expr_token->ambiguous_p) + && id_expr_token->error_reported) { cp_parser_simulate_error (parser); return error_mark_node; @@ -5313,7 +5313,7 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser, token = cp_lexer_consume_token (parser->lexer); if (!error_p) { - if (!token->ambiguous_p) + if (!token->error_reported) { tree decl; tree ambiguous_decls; @@ -8719,14 +8719,18 @@ cp_parser_lambda_expression (cp_parser* parser) tree lambda_expr = build_lambda_expr (); tree type; bool ok = true; + cp_token *token = cp_lexer_peek_token (parser->lexer); - LAMBDA_EXPR_LOCATION (lambda_expr) - = cp_lexer_peek_token (parser->lexer)->location; + LAMBDA_EXPR_LOCATION (lambda_expr) = token->location; if (cp_unevaluated_operand) { - error_at (LAMBDA_EXPR_LOCATION (lambda_expr), - "lambda-expression in unevaluated context"); + if (!token->error_reported) + { + error_at (LAMBDA_EXPR_LOCATION (lambda_expr), + "lambda-expression in unevaluated context"); + token->error_reported = true; + } ok = false; } @@ -19129,7 +19133,7 @@ cp_parser_class_name (cp_parser *parser, /* Look for the identifier. */ identifier_token = cp_lexer_peek_token (parser->lexer); - ambiguous_p = identifier_token->ambiguous_p; + ambiguous_p = identifier_token->error_reported; identifier = cp_parser_identifier (parser); /* If the next token isn't an identifier, we are certainly not looking at a class-name. */ diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h index d558c60..758c6df 100644 --- a/gcc/cp/parser.h +++ b/gcc/cp/parser.h @@ -51,10 +51,10 @@ typedef struct GTY (()) cp_token { ENUM_BITFIELD (pragma_kind) pragma_kind : 6; /* True if this token is from a context where it is implicitly extern "C" */ BOOL_BITFIELD implicit_extern_c : 1; - /* True for a CPP_NAME token that is not a keyword (i.e., for which - KEYWORD is RID_MAX) iff this name was looked up and found to be - ambiguous. An error has already been reported. */ - BOOL_BITFIELD ambiguous_p : 1; + /* True if an error has already been reported for this token, such as a + CPP_NAME token that is not a keyword (i.e., for which KEYWORD is + RID_MAX) iff this name was looked up and found to be ambiguous. */ + BOOL_BITFIELD error_reported : 1; /* True for a token that has been purged. If a token is purged, it is no longer a valid token and it should be considered deleted. */ |