rust/compiler
Nicholas Nethercote 1ae521e9d5 Return earlier in some cases in collect_token.
This example triggers an assertion failure:
```
fn f() -> u32 {
    #[cfg_eval] #[cfg(not(FALSE))] 0
}
```
The sequence of events:
- `configure_annotatable` calls `parse_expr_force_collect`, which calls
  `collect_tokens`.
- Within that, we end up in `parse_expr_dot_or_call`, which again calls
  `collect_tokens`.
  - The return value of the `f` call is the expression `0`.
  - This inner call collects tokens for `0` (parser range 10..11) and
    creates a replacement covering `#[cfg(not(FALSE))] 0` (parser range
    0..11).
- We return to the outer `collect_tokens` call. The return value of the
  `f` call is *again* the expression `0`, again with the range 10..11,
  but the replacement from earlier covers the range 0..11. The code
  mistakenly assumes that any attributes from an inner `collect_tokens`
  call fit entirely within the body of the result of an outer
  `collect_tokens` call. So it adjusts the replacement parser range
  0..11 to a node range by subtracting 10, resulting in -10..1. This is
  an invalid range and triggers an assertion failure.

It's tricky to follow, but basically things get complicated when an AST
node is returned from an inner `collect_tokens` call and then returned
again from an outer `collect_token` node without being wrapped in any
kind of additional layer.

This commit changes `collect_tokens` to return early in some extra cases,
avoiding the construction of lazy tokens. In the example above, the
outer `collect_tokens` returns earlier because the `0` token already has
tokens and `self.capture_state.capturing` is `Capturing::No`. This early
return avoids the creation of the invalid range and the assertion
failure.

Fixes #129166. Note: these invalid ranges have been happening for a long
time. #128725 looks like it's at fault only because it introduced the
assertion that catches the invalid ranges.
2024-08-23 14:40:08 +10:00
..
rustc Link std statically in rustc_driver 2024-08-11 04:16:53 +02:00
rustc_abi interpret: simplify pointer arithmetic logic 2024-08-01 14:25:19 +02:00
rustc_arena Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_ast Use more slice patterns inside the compiler 2024-08-07 13:37:52 +02:00
rustc_ast_ir Use dep: for crate dependencies 2024-07-15 12:40:10 -04:00
rustc_ast_lowering Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_ast_passes Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_ast_pretty Use more slice patterns inside the compiler 2024-08-07 13:37:52 +02:00
rustc_attr Use bool in favor of Option<()> for diagnostics 2024-08-21 01:31:11 -04:00
rustc_baked_icu_data
rustc_borrowck rename AddressOf -> RawBorrow inside the compiler 2024-08-18 19:46:53 +02:00
rustc_builtin_macros Auto merge of #128771 - carbotaniuman:stabilize_unsafe_attr, r=nnethercote 2024-08-17 22:48:42 +00:00
rustc_codegen_cranelift rename AddressOf -> RawBorrow inside the compiler 2024-08-18 19:46:53 +02:00
rustc_codegen_gcc stabilize raw_ref_op 2024-08-18 19:46:53 +02:00
rustc_codegen_llvm Rollup merge of #129332 - cuviper:cstr-cast, r=compiler-errors 2024-08-21 18:15:04 +02:00
rustc_codegen_ssa Simplify some redundant field names 2024-08-21 01:31:42 -04:00
rustc_const_eval Rollup merge of #129344 - compiler-errors:less-option-unit-diagnostics, r=jieyouxu 2024-08-21 18:15:05 +02:00
rustc_data_structures Update indexmap and use IndexMap::append 2024-08-13 16:16:57 -07:00
rustc_driver
rustc_driver_impl Rollup merge of #128762 - fmease:use-more-slice-pats, r=compiler-errors 2024-08-11 07:51:51 +02:00
rustc_error_codes stabilize raw_ref_op 2024-08-18 19:46:53 +02:00
rustc_error_messages Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_errors Update annotate-snippets to 0.11 2024-08-19 20:22:07 +00:00
rustc_expand Use bool in favor of Option<()> for diagnostics 2024-08-21 01:31:11 -04:00
rustc_feature Auto merge of #127672 - compiler-errors:precise-capturing, r=spastorino 2024-08-20 10:42:55 +00:00
rustc_fluent_macro Update annotate-snippets to 0.11 2024-08-19 20:22:07 +00:00
rustc_fs_util Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_graphviz Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_hir Auto merge of #127672 - compiler-errors:precise-capturing, r=spastorino 2024-08-20 10:42:55 +00:00
rustc_hir_analysis Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_hir_pretty Use FnSig instead of raw FnDecl for ForeignItemKind::Fn 2024-08-16 14:10:06 -04:00
rustc_hir_typeck Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_incremental Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_index Add and use IndexVec::append 2024-08-13 13:40:05 -07:00
rustc_index_macros Remove usage of specialization from newtype_index! 2024-06-30 16:42:53 +00:00
rustc_infer Auto merge of #128812 - nnethercote:shrink-TyKind-FnPtr, r=compiler-errors 2024-08-14 00:56:53 +00:00
rustc_interface Stabilize std:🧵:Builder::spawn_unchecked 2024-08-16 10:43:47 -07:00
rustc_lexer Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_lint Rollup merge of #129344 - compiler-errors:less-option-unit-diagnostics, r=jieyouxu 2024-08-21 18:15:05 +02:00
rustc_lint_defs Auto merge of #128771 - carbotaniuman:stabilize_unsafe_attr, r=nnethercote 2024-08-17 22:48:42 +00:00
rustc_llvm Auto merge of #128936 - bjorn3:fix_thin_archive_reading, r=jieyouxu 2024-08-15 14:13:52 +00:00
rustc_log Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_macros Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_metadata Simplify some redundant field names 2024-08-21 01:31:42 -04:00
rustc_middle Rollup merge of #129355 - RalfJung:PlaceMention, r=compiler-errors 2024-08-21 18:15:06 +02:00
rustc_mir_build Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_mir_dataflow rename AddressOf -> RawBorrow inside the compiler 2024-08-18 19:46:53 +02:00
rustc_mir_transform Simplify some redundant field names 2024-08-21 01:31:42 -04:00
rustc_monomorphize Use bool in favor of Option<()> for diagnostics 2024-08-21 01:31:11 -04:00
rustc_next_trait_solver Rollup merge of #128828 - lcnr:search-graph-11, r=compiler-errors 2024-08-14 21:43:07 +08:00
rustc_parse Return earlier in some cases in collect_token. 2024-08-23 14:40:08 +10:00
rustc_parse_format Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_passes Use bool in favor of Option<()> for diagnostics 2024-08-21 01:31:11 -04:00
rustc_pattern_analysis Rollup merge of #128965 - Zalathar:no-pat, r=Nadrieril 2024-08-15 18:44:16 -07:00
rustc_privacy Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_query_impl Simplify some redundant field names 2024-08-21 01:31:42 -04:00
rustc_query_system fix: simple typo in compiler directory 2024-08-20 20:50:32 +08:00
rustc_resolve Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_sanitizers Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_serialize Reformat use declarations. 2024-07-29 08:26:52 +10:00
rustc_session Rollup merge of #128348 - dingxiangfei2009:allow-shadow-call-stack-sanitizer, r=tmandry 2024-08-15 19:32:35 +02:00
rustc_smir Simplify some redundant field names 2024-08-21 01:31:42 -04:00
rustc_span #[deprecated_safe_2024]: Also use the // TODO: hint in the compiler error 2024-08-13 11:32:47 +02:00
rustc_symbol_mangling Shrink TyKind::FnPtr. 2024-08-09 14:33:25 +10:00
rustc_target Make ArgAbi::make_indirect_force more specific 2024-08-21 02:43:12 +01:00
rustc_trait_selection Rollup merge of #129345 - compiler-errors:scratch4, r=jieyouxu 2024-08-21 18:15:06 +02:00
rustc_traits Remove redundant type ops 2024-08-14 14:18:17 -04:00
rustc_transmute safe transmute: forbid reference lifetime extension 2024-08-18 18:31:06 +00:00
rustc_ty_utils Use bool in favor of Option<()> for diagnostics 2024-08-21 01:31:11 -04:00
rustc_type_ir Rollup merge of #128828 - lcnr:search-graph-11, r=compiler-errors 2024-08-14 21:43:07 +08:00
rustc_type_ir_macros Reformat use declarations. 2024-07-29 08:26:52 +10:00
stable_mir Reformat use declarations. 2024-07-29 08:26:52 +10:00