rust/compiler
Guillaume Gomez 2e3bde2bc4
Rollup merge of #122004 - fmease:astvalidator-min-fix, r=compiler-errors
AST validation: Improve handling of inherent impls nested within functions and anon consts

Minimal fix for issue #121607 extracted from PR #120698 for ease of backporting and since I'd like to improve PR #120698 in such a way that it makes AST validator truly robust against such sort of regressions (AST validator is generally *beyond* footgun-y atm). The current version of PR #120698 sort of does that already but there's still room for improvement.

Fixes #89342.
Fixes [after beta-backport] #121607.
Partially addresses #119924 (#120698 aims to fully fix it).

---

### Explainer

The last commit of PR #119505 regressed issue #121607.

Previously we would reject visibilities on associated items with `visibility_not_permitted` if we were in a trait (by checking the parameter `ctxt` of `visit_assoc_item` which was 100% accurate) or if we were in a trait impl (by checking a flag called `in_trait_impl` tracked in `AstValidator` which was/is only accurate if the visitor methods correctly updated it which isn't actually the case giving rise to the old open issue #89342).

In PR #119505, I moved even more state into the `AstValidator` by generalizing the flag `in_trait_impl` to `trait_or_trait_impl` to be able to report more precise diagnostics (modeling *Trait | TraitImpl*). However since we/I didn't update `trait_or_trait_impl` in all places to reflect reality (similar to us not updating `in_trait_impl` before), this lead to https://github.com/rust-lang/rust/issues/121607#issuecomment-1963084636 getting wrongfully rejected. Since PR #119505 we reject visibilities if the “globally tracked” (wrt. to `AstValidator`) `outer_trait_or_trait_impl` is `Some`.

Crucially, when visiting an inherent impl, I never reset `outer_trait_or_trait_impl` back to `None` leading us to believe that `bar` in the stack [`trait Foo` > `fn foo` > `impl Bar` > `pub fn bar`] (from the MCVE) was an inherent associated item (we saw `trait Foo` but not `impl Bar` before it).

The old open issue #89342 is caused by the aforementioned issue of us never updating `in_trait_impl` prior to my PR #119505 / `outer_trait_or_trait` after my PR. Stack: [`impl Default for Foo` > `{` > `impl Foo` > `pub const X`] (we only saw `impl Default for Foo` but not the `impl Foo` before it).

---

This PR is only meant to be a *hot fix*. I plan on completely *rewriting* `AstValidator` from the ground up to not rely on “globally tracked” state like this or at least make it close to impossible to forget updating it when descending into nested items (etc.). Other visitors do a way better job at that (e.g. AST lowering). I actually plan on experimenting with moving more and more logic from `AstValidator` into the AST lowering pass/stage/visitor to follow the [Parse, don't validate](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/) “pattern”.

---

r? `@compiler-errors`
2024-03-07 18:32:47 +01:00
..
rustc
rustc_abi Rollup merge of #121382 - nnethercote:rework-untranslatable_diagnostic-lint, r=davidtwco 2024-03-06 22:02:46 +01:00
rustc_arena rename ptr::invalid -> ptr::without_provenance 2024-02-21 20:15:52 +01:00
rustc_ast Auto merge of #122045 - matthiaskrgr:rollup-5l3vpn7, r=matthiaskrgr 2024-03-06 02:18:22 +00:00
rustc_ast_ir Move visitor utils to rustc_ast_ir 2024-03-05 12:38:03 -05:00
rustc_ast_lowering Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_ast_passes Rollup merge of #122004 - fmease:astvalidator-min-fix, r=compiler-errors 2024-03-07 18:32:47 +01:00
rustc_ast_pretty Rollup merge of #121815 - nnethercote:mv-gather_comments, r=est31 2024-03-02 10:09:36 +01:00
rustc_attr Rewrite the untranslatable_diagnostic lint. 2024-03-06 14:19:01 +11:00
rustc_baked_icu_data Bump cfg(bootstrap)s 2023-11-15 19:41:28 -05:00
rustc_borrowck Add missing #[rustc_lint_diagnostics] attributes. 2024-03-06 14:19:38 +11:00
rustc_builtin_macros Move visitor utils to rustc_ast_ir 2024-03-05 12:38:03 -05:00
rustc_codegen_cranelift only set noalias on Box with the global allocator 2024-03-05 15:03:33 +01:00
rustc_codegen_gcc only set noalias on Box with the global allocator 2024-03-05 15:03:33 +01:00
rustc_codegen_llvm only set noalias on Box with the global allocator 2024-03-05 15:03:33 +01:00
rustc_codegen_ssa Rollup merge of #122051 - erikdesjardins:cleanup, r=nikic 2024-03-06 22:02:48 +01:00
rustc_const_eval Auto merge of #121985 - RalfJung:interpret-return-place, r=oli-obk 2024-03-07 12:33:19 +00:00
rustc_data_structures Rollup merge of #120976 - matthiaskrgr:constify_TL_statics, r=lcnr 2024-03-04 22:16:30 +01:00
rustc_driver Bump cfg(bootstrap)s 2023-11-15 19:41:28 -05:00
rustc_driver_impl Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_error_codes Rollup merge of #120684 - carschandler:patch-1, r=nnethercote 2024-03-02 10:09:35 +01:00
rustc_error_messages Rename SubdiagnosticMessage as SubdiagMessage. 2024-03-05 12:14:49 +11:00
rustc_errors Rollup merge of #121382 - nnethercote:rework-untranslatable_diagnostic-lint, r=davidtwco 2024-03-06 22:02:46 +01:00
rustc_expand Rollup merge of #121382 - nnethercote:rework-untranslatable_diagnostic-lint, r=davidtwco 2024-03-06 22:02:46 +01:00
rustc_feature Rollup merge of #119888 - weiznich:stablize_diagnostic_namespace, r=compiler-errors 2024-03-07 18:32:46 +01:00
rustc_fluent_macro Rename SubdiagnosticMessage as SubdiagMessage. 2024-03-05 12:14:49 +11:00
rustc_fs_util Invert diagnostic lints. 2024-02-06 13:12:33 +11:00
rustc_graphviz Invert diagnostic lints. 2024-02-06 13:12:33 +11:00
rustc_hir Auto merge of #122045 - matthiaskrgr:rollup-5l3vpn7, r=matthiaskrgr 2024-03-06 02:18:22 +00:00
rustc_hir_analysis Rollup merge of #122123 - compiler-errors:object-trait-alias-bounds, r=oli-obk 2024-03-07 15:07:09 +01:00
rustc_hir_pretty Lower anonymous structs or unions to HIR 2024-02-12 12:47:23 +08:00
rustc_hir_typeck Apply EarlyBinder only to TraitRef in ImplTraitHeader 2024-03-07 13:56:29 +01:00
rustc_incremental Rename all ParseSess variables/fields/lifetimes as psess. 2024-03-05 08:11:45 +11:00
rustc_index doc: Add better explanation 2024-03-06 16:54:42 +01:00
rustc_index_macros Step all bootstrap cfgs forward 2024-02-08 07:44:34 -05:00
rustc_infer Rollup merge of #121863 - lukas-code:silence-mismatched-super-projections, r=lcnr 2024-03-07 15:07:05 +01:00
rustc_interface Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_lexer Invert diagnostic lints. 2024-02-06 13:12:33 +11:00
rustc_lint Auto merge of #122113 - matthiaskrgr:rollup-5d1jnwi, r=matthiaskrgr 2024-03-07 02:30:40 +00:00
rustc_lint_defs Rename BuiltinLintDiagnostics as BuiltinLintDiag. 2024-03-05 12:15:10 +11:00
rustc_llvm Rollup merge of #122062 - workingjubilee:initialize-my-fist, r=cuviper 2024-03-07 00:57:40 +01:00
rustc_log rustc_log: expose tracing-tree "wraparound" in an env var 2024-03-03 12:33:26 +01:00
rustc_macros Convert TypeVisitor and DefIdVisitor to use VisitorResult 2024-03-05 13:28:15 -05:00
rustc_metadata Rollup merge of #122114 - saethlin:cant-find-crate-spam, r=WaffleLapkin 2024-03-07 15:07:08 +01:00
rustc_middle Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_mir_build Additional comments for lowering if 2024-03-06 17:08:28 +11:00
rustc_mir_dataflow Return a struct from query intrinsic to be able to add another field in the next commit 2024-03-04 16:13:50 +00:00
rustc_mir_transform Auto merge of #121985 - RalfJung:interpret-return-place, r=oli-obk 2024-03-07 12:33:19 +00:00
rustc_monomorphize Apply EarlyBinder only to TraitRef in ImplTraitHeader 2024-03-07 13:56:29 +01:00
rustc_next_trait_solver Allow a way to add constructors for rustc_type_ir types 2024-03-04 15:39:59 +00:00
rustc_parse Cancel parsing ever made during recovery 2024-03-06 21:59:03 +00:00
rustc_parse_format remove a couple of redundant clones 2024-02-17 12:46:18 +01:00
rustc_passes Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_pattern_analysis Rollup merge of #121987 - Nadrieril:abort-on-arity-mismatch, r=compiler-errors 2024-03-05 06:40:33 +01:00
rustc_privacy Convert SpannedTypeVisitor to use VisitorResult 2024-03-05 13:30:46 -05:00
rustc_query_impl Avoid using unnecessary queries when printing the query stack in panics 2024-03-04 20:43:58 +01:00
rustc_query_system Don't panic when waiting on poisoned queries 2024-03-02 19:51:56 +01:00
rustc_resolve Rollup merge of #121089 - oli-obk:create_def_feed, r=petrochenkov 2024-03-07 18:32:47 +01:00
rustc_serialize Replace NonZero::<_>::new with NonZero::new. 2024-02-15 08:09:42 +01:00
rustc_session Rollup merge of #121959 - sundeep-kokkonda:patch-2, r=davidtwco 2024-03-06 22:02:47 +01:00
rustc_smir Add support to new float types 2024-03-01 11:16:35 -08:00
rustc_span only set noalias on Box with the global allocator 2024-03-05 15:03:33 +01:00
rustc_symbol_mangling Rollup merge of #121841 - tgross35:f16-f128-step2-intrinsics, r=compiler-errors 2024-03-02 20:13:24 +01:00
rustc_target loongarch: add frecipe and relax target feature 2024-03-06 17:24:32 +08:00
rustc_trait_selection Rollup merge of #122123 - compiler-errors:object-trait-alias-bounds, r=oli-obk 2024-03-07 15:07:09 +01:00
rustc_traits Merge check_mod_impl_wf and check_mod_type_wf 2024-03-07 06:27:09 +00:00
rustc_transmute Convert TypeVisitor and DefIdVisitor to use VisitorResult 2024-03-05 13:28:15 -05:00
rustc_ty_utils Apply EarlyBinder only to TraitRef in ImplTraitHeader 2024-03-07 13:56:29 +01:00
rustc_type_ir Convert TypeVisitor and DefIdVisitor to use VisitorResult 2024-03-05 13:28:15 -05:00
stable_mir Add support to new float types 2024-03-01 11:16:35 -08:00