https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96328
Mark Wielaard <mark at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #2 from Mark Wielaard <mark at gcc dot gnu.org> --- Only tested on the failing testcase, but this seems to fix it: $ echo "friend" | /opt/local/install/gcc/bin/g++ -c -xc++ - <stdin>:1:1: error: ‘friend’ used outside of class <stdin>:2: error: expected unqualified-id at end of input diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0c77c20da862..9c4f6a50523c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -781,9 +781,13 @@ static cp_token * cp_lexer_safe_previous_token (cp_lexer *lexer) { if (lexer->buffer) - if (lexer->next_token != lexer->buffer->address ()) - return cp_lexer_previous_token (lexer); - + { + cp_token_position tp = cp_lexer_previous_token_position (lexer); + while (tp->purged_p && tp != lexer->buffer->address ()) + tp--; + if (tp != lexer->buffer->address ()) + return tp; + } return NULL; } @@ -2932,15 +2936,15 @@ cp_parser_error_1 (cp_parser* parser, const char* gmsgid, gcc_rich_location richloc (input_location); bool added_matching_location = false; + cp_token *prev_token = cp_lexer_safe_previous_token (parser->lexer); - if (missing_token_desc != RT_NONE) + if (prev_token && missing_token_desc != RT_NONE) { /* Potentially supply a fix-it hint, suggesting to add the missing token immediately after the *previous* token. This may move the primary location within richloc. */ enum cpp_ttype ttype = get_required_cpp_ttype (missing_token_desc); - location_t prev_token_loc - = cp_lexer_previous_token (parser->lexer)->location; + location_t prev_token_loc = prev_token->location; maybe_suggest_missing_token_insertion (&richloc, ttype, prev_token_loc); /* If matching_location != UNKNOWN_LOCATION, highlight it. @@ -2957,7 +2961,6 @@ cp_parser_error_1 (cp_parser* parser, const char* gmsgid, standard string literal constants defined in header files. If there is one, then add that as an hint to the error message. */ name_hint h; - cp_token *prev_token = cp_lexer_safe_previous_token (parser->lexer); if (prev_token && cp_parser_is_string_literal (prev_token) && token->type == CPP_NAME) {