===================================================================
@@ -10894,16 +10894,26 @@ cp_parser_for_init_statement (cp_parser* parser, t
parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
{
- /* It is a range-for, consume the ':' */
- cp_lexer_consume_token (parser->lexer);
- is_range_for = true;
- if (cxx_dialect < cxx11)
+ if (*decl == error_mark_node)
{
- pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
- "range-based %<for%> loops only available with "
- "-std=c++11 or -std=gnu++11");
- *decl = error_mark_node;
+ /* Give an error and consume the ':' anyway for better
+ error recovery. */
+ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
+ cp_lexer_consume_token (parser->lexer);
}
+ else
+ {
+ /* It is a range-for, consume the ':' */
+ cp_lexer_consume_token (parser->lexer);
+ is_range_for = true;
+ if (cxx_dialect < cxx11)
+ {
+ pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
+ "range-based %<for%> loops only available with "
+ "-std=c++11 or -std=gnu++11");
+ *decl = error_mark_node;
+ }
+ }
}
else
/* The ';' is not consumed yet because we told
===================================================================
@@ -0,0 +1,10 @@
+// PR c++/63985
+// { dg-require-effective-target c++11 }
+
+int main()
+{
+ int arr;
+ for (int i = 5: arr) // { dg-error "expected ';'" }
+ return 1;
+ return 0;
+}