]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
parser.h (struct cp_token): Rename ambiguous_p to error_reported.
authorJason Merrill <jason@redhat.com>
Fri, 11 Apr 2014 18:25:07 +0000 (14:25 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 11 Apr 2014 18:25:07 +0000 (14:25 -0400)
* 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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/parser.h

index a1cadeb5877774b2137412a56fcaca74bf2af6a4..bf61ab7564b101041c8111f511daba2a58f202ef 100644 (file)
@@ -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.
index f386eed275d9fe1e375968a1e24d04af5533b5ad..bb59e3bcdd19b3d99c06665b85d1ba445434b112 100644 (file)
@@ -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.  */
index d558c607f4d0c49a9494bbd125c6581399ccde93..758c6df3c27df7d024213c913e3dfc22df9f354e 100644 (file)
@@ -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.  */