On 1/26/26 10:52 PM, Marek Polacek wrote:
On Sat, Jan 24, 2026 at 05:25:06PM +0800, Jason Merrill wrote:
On 1/22/26 6:17 AM, Marek Polacek wrote:
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

-- >8 --
In cp_parser_splice_spec_is_nns_p I didn't use saved_token_sentinel:
its rollback uses cp_lexer_previous_token so if we are the first token
in the file, there are no previous tokens so we crash.

It would be simple to just use the _safe variant of cp_lexer_previous_token
and be done with this.  But that's not how this worked out: I saw a new
-fcompare-debug FAIL with pr104025.C.  The problem is that at the end of
cp_parser_id_expression we have a saved_token_sentinel guarded by
warn_missing_template_keyword and in that spot lexer->buffer is NULL (so
cp_lexer_set_source_position_from_token would be skipped).  pr104025.C
is compiled twice, the second time with "-w -fcompare-debug-second".  So
the first time we don't _set_source_position back to where we were after the
_skip_entire_template_parameter_list (lexer->buffer is NULL) and the second
time we don't get to the saved_token_sentinel at all.  That left us with
different columns in the location:

    "pr104025.C":16:16 vs "pr104025.C":16:12

thus the -fcompare-debug FAIL.  I assume we don't want -fcompare-debug
to ignore the column location.

Agreed.

So this patch adds STS_ROLLBACK_SAFE to
use the _safe variant of cp_lexer_previous_token.

How about if safe_previous_token returns null then we use the current token
instead?  I'd rather not add separate modes.

I also don't like adding a new mode.  But using the current token leads
to the same -fcompare-debug FAIL with pr104025.C:
"pr104025.C":16:14 vs "pr104025.C":16:12

As before, once we don't do saved_token_sentinel at all, and the second time
we _set_source_position to something that doesn't match the previous position.

Ah, so the problem is that _safe_previous_ is incompatible with cp_lexer_new_from_tokens because the latter sets buffer to null. Perhaps instead it should set it properly and the condition in cp_lexer_destroy should check saved_type instead of buffer.

Or we could just save input_location in saved_token_sentinel instead of trying to recover it.

Jason

Reply via email to