rust/compiler
bors 894f7a4ba6 Auto merge of #126678 - nnethercote:fix-duplicated-attrs-on-nt-expr, r=petrochenkov
Fix duplicated attributes on nonterminal expressions

This PR fixes a long-standing bug (#86055) whereby expression attributes can be duplicated when expanded through declarative macros.

First, consider how items are parsed in declarative macros:
```
Items:
- parse_nonterminal
  - parse_item(ForceCollect::Yes)
    - parse_item_
      - attrs = parse_outer_attributes
      - parse_item_common(attrs)
        - maybe_whole!
        - collect_tokens_trailing_token
```
The important thing is that the parsing of outer attributes is outside token collection, so the item's tokens don't include the attributes. This is how it's supposed to be.

Now consider how expression are parsed in declarative macros:
```
Exprs:
- parse_nonterminal
  - parse_expr_force_collect
    - collect_tokens_no_attrs
      - collect_tokens_trailing_token
        - parse_expr
          - parse_expr_res(None)
            - parse_expr_assoc_with
              - parse_expr_prefix
                - parse_or_use_outer_attributes
                - parse_expr_dot_or_call
```
The important thing is that the parsing of outer attributes is inside token collection, so the the expr's tokens do include the attributes, i.e. in `AttributesData::tokens`.

This PR fixes the bug by rearranging expression parsing to that outer attribute parsing happens outside of token collection. This requires a number of small refactorings because expression parsing is somewhat complicated. While doing so the PR makes the code a bit cleaner and simpler, by eliminating `parse_or_use_outer_attributes` and `Option<AttrWrapper>` arguments (in favour of the simpler `parse_outer_attributes` and `AttrWrapper` arguments), and simplifying `LhsExpr`.

r? `@petrochenkov`
2024-06-19 13:58:21 +00:00
..
rustc Change SIGPIPE ui from #[unix_sigpipe = "..."] to -Zon-broken-pipe=... 2024-05-02 19:48:29 +02:00
rustc_abi Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_arena Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast Auto merge of #126678 - nnethercote:fix-duplicated-attrs-on-nt-expr, r=petrochenkov 2024-06-19 13:58:21 +00:00
rustc_ast_ir Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast_lowering Rollup merge of #125293 - dingxiangfei2009:tail-expr-temp-lifetime, r=estebank,davidtwco 2024-06-19 01:51:38 +01:00
rustc_ast_passes Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_ast_pretty Rollup merge of #124135 - petrochenkov:deleglob, r=fmease 2024-06-19 01:51:36 +01:00
rustc_attr Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_baked_icu_data Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_borrowck Remove redundant argument from subdiagnostic method 2024-06-18 15:42:11 +00:00
rustc_builtin_macros Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_codegen_cranelift Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_codegen_gcc Remove redundant argument from subdiagnostic method 2024-06-18 15:42:11 +00:00
rustc_codegen_llvm Remove redundant argument from subdiagnostic method 2024-06-18 15:42:11 +00:00
rustc_codegen_ssa Rollup merge of #126594 - zetanumbers:fix-cross-crate-async-drop-glue, r=oli-obk 2024-06-19 09:52:01 +02:00
rustc_const_eval Rollup merge of #126154 - RalfJung:storage-live, r=compiler-errors 2024-06-19 13:04:58 +02:00
rustc_data_structures Use Linux file locking on Redox 2024-06-16 12:56:50 +00:00
rustc_driver Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_driver_impl Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_error_codes Auto merge of #126319 - workingjubilee:rollup-lendnud, r=workingjubilee 2024-06-12 11:10:50 +00:00
rustc_error_messages Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_errors Remove redundant argument from subdiagnostic method 2024-06-18 15:42:11 +00:00
rustc_expand Rollup merge of #124135 - petrochenkov:deleglob, r=fmease 2024-06-19 01:51:36 +01:00
rustc_feature Rollup merge of #125293 - dingxiangfei2009:tail-expr-temp-lifetime, r=estebank,davidtwco 2024-06-19 01:51:38 +01:00
rustc_fluent_macro Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_fs_util Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_graphviz Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_hir Rework precise capturing syntax 2024-06-17 22:35:25 -04:00
rustc_hir_analysis Rollup merge of #125293 - dingxiangfei2009:tail-expr-temp-lifetime, r=estebank,davidtwco 2024-06-19 01:51:38 +01:00
rustc_hir_pretty Rework precise capturing syntax 2024-06-17 22:35:25 -04:00
rustc_hir_typeck Auto merge of #125852 - bvanjoi:improve-tip-for-invisible-trait, r=compiler-errors 2024-06-19 06:19:22 +00:00
rustc_incremental Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_index Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_index_macros rustc_span: Minor improvements 2024-06-16 14:08:25 +03:00
rustc_infer Allow constraining opaque types during subtyping in the trait system 2024-06-19 08:29:17 +00:00
rustc_interface Auto merge of #126623 - oli-obk:do_not_count_errors, r=davidtwco 2024-06-18 16:49:19 +00:00
rustc_lexer Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_lint Rollup merge of #126422 - Urgau:doctest-impl-non-local-def, r=fmease 2024-06-19 01:51:39 +01:00
rustc_lint_defs Resolve elided lifetimes in assoc const to static if no other lifetimes are in scope 2024-06-14 11:05:35 -04:00
rustc_llvm Auto merge of #125141 - SergioGasquez:feat/no_std-xtensa, r=davidtwco 2024-06-12 13:43:31 +00:00
rustc_log Bump tracing-tree and allow rendering lines again 2024-06-12 10:11:41 +00:00
rustc_macros Remove redundant argument from subdiagnostic method 2024-06-18 15:42:11 +00:00
rustc_metadata Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_middle Auto merge of #126679 - fmease:rollup-njrv2py, r=fmease 2024-06-19 11:09:31 +00:00
rustc_mir_build Auto merge of #126679 - fmease:rollup-njrv2py, r=fmease 2024-06-19 11:09:31 +00:00
rustc_mir_dataflow Use is_lang_item more aggressively 2024-06-14 16:54:29 -04:00
rustc_mir_transform Auto merge of #126623 - oli-obk:do_not_count_errors, r=davidtwco 2024-06-18 16:49:19 +00:00
rustc_monomorphize Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_next_trait_solver Fix transmute goal 2024-06-18 11:04:01 -04:00
rustc_parse Auto merge of #126678 - nnethercote:fix-duplicated-attrs-on-nt-expr, r=petrochenkov 2024-06-19 13:58:21 +00:00
rustc_parse_format Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_passes Rollup merge of #124580 - gurry:124556-suggest-remove-tuple-field, r=jackh726 2024-06-19 09:51:59 +02:00
rustc_pattern_analysis Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_privacy Do not ICE in privacy when type inference fails. 2024-06-17 10:09:27 +00:00
rustc_query_impl Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_query_system Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_resolve Rollup merge of #124135 - petrochenkov:deleglob, r=fmease 2024-06-19 01:51:36 +01:00
rustc_sanitizers Make async drop code more consistent with regular drop code 2024-06-18 14:17:13 +03:00
rustc_serialize Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_session Unconditionally warn on usage of wasm32-wasi 2024-06-18 21:05:56 -07:00
rustc_smir Rename InstanceDef -> InstanceKind 2024-06-16 21:35:21 -04:00
rustc_span Rollup merge of #125293 - dingxiangfei2009:tail-expr-temp-lifetime, r=estebank,davidtwco 2024-06-19 01:51:38 +01:00
rustc_symbol_mangling Use a dedicated type instead of a reference for the diagnostic context 2024-06-18 15:42:11 +00:00
rustc_target Add i686-unknown-redox target 2024-06-16 12:56:48 +00:00
rustc_trait_selection Auto merge of #126614 - compiler-errors:uplift-next-trait-solver, r=lcnr 2024-06-18 19:41:33 +00:00
rustc_traits Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_transmute safe transmute: support non-ZST, variantful, uninhabited enums 2024-06-14 21:11:08 +00:00
rustc_ty_utils Rename InstanceDef -> InstanceKind 2024-06-16 21:35:21 -04:00
rustc_type_ir Rollup merge of #126656 - fmease:skip-debug-for-_, r=compiler-errors 2024-06-19 09:52:02 +02:00
rustc_type_ir_macros Uplift TraitPredicate 2024-05-11 18:20:00 -04:00
stable_mir Rollup merge of #126410 - RalfJung:smir-const-operand, r=oli-obk 2024-06-15 19:51:35 +02:00