Skip to content

Commit f9988fe

Browse files
committed
Auto merge of #155611 - JonathanBrouwer:rollup-hUV99y1, r=JonathanBrouwer
Rollup of 5 pull requests Successful merges: - #155546 (Improve E0308 error message for `impl Trait` return mismatches) - #152834 (Fix incorrect `let` to `const` suggestion for pattern bindings) - #155425 (Remove duplicated `Flags` methods.) - #155547 (Use per-parent disambiguators everywhere) - #155590 (Remove AttributeLintKind variants - part 5)
2 parents 9ec5d5f + 79e2ff7 commit f9988fe

44 files changed

Lines changed: 405 additions & 284 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.mailmap

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,11 @@ Greg V <greg@unrelenting.technology>
258258
Gregor Peach <gregorpeach@gmail.com>
259259
Grzegorz Bartoszek <grzegorz.bartoszek@thaumatec.com>
260260
Guanqun Lu <guanqun.lu@gmail.com>
261-
Guillaume Gomez <guillaume1.gomez@gmail.com>
262-
Guillaume Gomez <guillaume1.gomez@gmail.com> ggomez <ggomez@ggo.ifr.lan>
263-
Guillaume Gomez <guillaume1.gomez@gmail.com> Guillaume Gomez <ggomez@ggo.ifr.lan>
264-
Guillaume Gomez <guillaume1.gomez@gmail.com> Guillaume Gomez <guillaume.gomez@huawei.com>
265-
Guillaume Gomez <guillaume1.gomez@gmail.com> Guillaume Gomez <contact@guillaume-gomez.fr>
261+
Guillaume Gomez <contact@guillaume-gomez.fr>
262+
Guillaume Gomez <contact@guillaume-gomez.fr> Guillaume Gomez <guillaume1.gomez@gmail.com>
263+
Guillaume Gomez <contact@guillaume-gomez.fr> ggomez <ggomez@ggo.ifr.lan>
264+
Guillaume Gomez <contact@guillaume-gomez.fr> Guillaume Gomez <ggomez@ggo.ifr.lan>
265+
Guillaume Gomez <contact@guillaume-gomez.fr> Guillaume Gomez <guillaume.gomez@huawei.com>
266266
gnzlbg <gonzalobg88@gmail.com> <gnzlbg@users.noreply.github.com>
267267
hamidreza kalbasi <hamidrezakalbasi@protonmail.com>
268268
Hanna Kruppe <hanna.kruppe@gmail.com> <robin.kruppe@gmail.com>

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
use std::mem;
2+
use std::sync::Arc;
23

34
use rustc_abi::ExternAbi;
45
use rustc_ast::visit::AssocCtxt;
56
use rustc_ast::*;
67
use rustc_data_structures::fx::FxIndexMap;
8+
use rustc_data_structures::steal::Steal;
79
use rustc_errors::{E0570, ErrorGuaranteed, struct_span_code_err};
810
use rustc_hir::attrs::{AttributeKind, EiiImplResolution};
911
use rustc_hir::def::{DefKind, PerNS, Res};
10-
use rustc_hir::def_id::{CRATE_DEF_ID, LocalDefId};
12+
use rustc_hir::def_id::{CRATE_DEF_ID, LocalDefId, LocalDefIdMap};
13+
use rustc_hir::definitions::PerParentDisambiguatorState;
1114
use rustc_hir::{
1215
self as hir, HirId, ImplItemImplKind, LifetimeSource, PredicateOrigin, Target, find_attr,
1316
};
@@ -48,11 +51,21 @@ impl<'hir> Owners<'_, 'hir> {
4851
}
4952
}
5053

54+
/// Default disambiguators are used during default lowering, when we lower
55+
/// AST owners in a loop we can use the whole map, in contrast delayed lowering
56+
/// lowers each AST owner separately, so we use readonly disambiguators map
57+
/// with `Steal`s to get disambiguators.
58+
pub(super) enum Disambiguators {
59+
Default(LocalDefIdMap<PerParentDisambiguatorState>),
60+
Delayed(Arc<LocalDefIdMap<Steal<PerParentDisambiguatorState>>>),
61+
}
62+
5163
pub(super) struct ItemLowerer<'a, 'hir, R> {
5264
pub(super) tcx: TyCtxt<'hir>,
5365
pub(super) resolver: &'a mut R,
5466
pub(super) ast_index: &'a IndexSlice<LocalDefId, AstOwner<'a>>,
5567
pub(super) owners: Owners<'a, 'hir>,
68+
pub(super) disambiguators: &'a mut Disambiguators,
5669
}
5770

5871
/// When we have a ty alias we *may* have two where clauses. To give the best diagnostics, we set the span
@@ -80,7 +93,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> ItemLowerer<'_, 'hir, R> {
8093
owner: NodeId,
8194
f: impl FnOnce(&mut LoweringContext<'_, 'hir, R>) -> hir::OwnerNode<'hir>,
8295
) {
83-
let mut lctx = LoweringContext::new(self.tcx, self.resolver);
96+
let mut lctx = LoweringContext::new(self.tcx, self.resolver, self.disambiguators);
8497
lctx.with_hir_id_owner(owner, |lctx| f(lctx));
8598

8699
for (def_id, info) in lctx.children {

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ use thin_vec::ThinVec;
7070
use tracing::{debug, instrument, trace};
7171

7272
use crate::errors::{AssocTyParentheses, AssocTyParenthesesSub, MisplacedImplTrait};
73-
use crate::item::Owners;
73+
use crate::item::{Disambiguators, Owners};
7474

7575
macro_rules! arena_vec {
7676
($this:expr; $($x:expr),*) => (
@@ -94,7 +94,8 @@ pub mod stability;
9494
struct LoweringContext<'a, 'hir, R> {
9595
tcx: TyCtxt<'hir>,
9696
resolver: &'a mut R,
97-
disambiguator: PerParentDisambiguatorState,
97+
disambiguators: &'a mut Disambiguators,
98+
current_disambiguator: PerParentDisambiguatorState,
9899

99100
/// Used to allocate HIR nodes.
100101
arena: &'hir hir::Arena<'hir>,
@@ -154,12 +155,13 @@ struct LoweringContext<'a, 'hir, R> {
154155
}
155156

156157
impl<'a, 'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'a, 'hir, R> {
157-
fn new(tcx: TyCtxt<'hir>, resolver: &'a mut R) -> Self {
158+
fn new(tcx: TyCtxt<'hir>, resolver: &'a mut R, disambiguators: &'a mut Disambiguators) -> Self {
158159
let registered_tools = tcx.registered_tools(()).iter().map(|x| x.name).collect();
159160
Self {
160161
tcx,
161162
resolver,
162-
disambiguator: Default::default(),
163+
disambiguators,
164+
current_disambiguator: Default::default(),
163165
arena: tcx.hir_arena,
164166

165167
// HirId handling.
@@ -302,10 +304,6 @@ impl<'a, 'tcx> ResolverAstLoweringExt<'tcx> for ResolverDelayedAstLowering<'a, '
302304
fn next_node_id(&mut self) -> NodeId {
303305
next_node_id(&mut self.next_node_id)
304306
}
305-
306-
fn steal_or_create_disambiguator(&self, parent: LocalDefId) -> PerParentDisambiguatorState {
307-
self.base.steal_or_create_disambiguator(parent)
308-
}
309307
}
310308

311309
fn next_node_id(current_id: &mut NodeId) -> NodeId {
@@ -408,10 +406,6 @@ impl<'tcx> ResolverAstLowering<'tcx> {
408406
fn next_node_id(&mut self) -> NodeId {
409407
next_node_id(&mut self.next_node_id)
410408
}
411-
412-
fn steal_or_create_disambiguator(&self, parent: LocalDefId) -> PerParentDisambiguatorState {
413-
self.per_parent_disambiguators.get(&parent).map(|s| s.steal()).unwrap_or_default()
414-
}
415409
}
416410

417411
/// How relaxed bounds `?Trait` should be treated.
@@ -632,11 +626,13 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> mid_hir::Crate<'_> {
632626
tcx.definitions_untracked().def_index_count(),
633627
);
634628

629+
let mut disambiguators = Disambiguators::Default(resolver.disambiguators.steal());
635630
let mut lowerer = item::ItemLowerer {
636631
tcx,
637632
resolver: &mut resolver,
638633
ast_index: &ast_index,
639634
owners: Owners::IndexVec(&mut owners),
635+
disambiguators: &mut disambiguators,
640636
};
641637

642638
let mut delayed_ids: FxIndexSet<LocalDefId> = Default::default();
@@ -655,15 +651,19 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> mid_hir::Crate<'_> {
655651
let opt_hir_hash =
656652
if tcx.needs_crate_hash() { Some(compute_hir_hash(tcx, &owners)) } else { None };
657653

658-
let delayed_resolver = Steal::new((resolver, krate));
654+
let Disambiguators::Default(disambiguators) = disambiguators else { unreachable!() };
655+
let delayed_disambigs =
656+
Arc::new(disambiguators.into_items().map(|(id, d)| (id, Steal::new(d))).collect());
657+
658+
let delayed_resolver = Steal::new((resolver, krate, delayed_disambigs));
659659
mid_hir::Crate::new(owners, delayed_ids, delayed_resolver, opt_hir_hash)
660660
}
661661

662662
/// Lowers an AST owner corresponding to `def_id`, now only delegations are lowered this way.
663663
pub fn lower_delayed_owner(tcx: TyCtxt<'_>, def_id: LocalDefId) {
664664
let krate = tcx.hir_crate(());
665665

666-
let (resolver, krate) = &*krate.delayed_resolver.borrow();
666+
let (resolver, krate, delayed_disambigs) = &*krate.delayed_resolver.borrow();
667667

668668
// FIXME!!!(fn_delegation): make ast index lifetime same as resolver,
669669
// as it is too bad to reindex whole crate on each delegation lowering.
@@ -677,12 +677,12 @@ pub fn lower_delayed_owner(tcx: TyCtxt<'_>, def_id: LocalDefId) {
677677
};
678678

679679
let mut map = Default::default();
680-
681680
let mut lowerer = item::ItemLowerer {
682681
tcx,
683682
resolver: &mut resolver,
684683
ast_index: &ast_index,
685684
owners: Owners::Map(&mut map),
685+
disambiguators: &mut Disambiguators::Delayed(Arc::clone(delayed_disambigs)),
686686
};
687687

688688
lowerer.lower_node(def_id);
@@ -740,7 +740,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
740740
let def_id = self
741741
.tcx
742742
.at(span)
743-
.create_def(parent, name, def_kind, None, &mut self.disambiguator)
743+
.create_def(parent, name, def_kind, None, &mut self.current_disambiguator)
744744
.def_id();
745745

746746
debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
@@ -780,9 +780,16 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
780780
f: impl FnOnce(&mut Self) -> hir::OwnerNode<'hir>,
781781
) {
782782
let owner_id = self.owner_id(owner);
783+
let def_id = owner_id.def_id;
784+
785+
let new_disambig = match &mut self.disambiguators {
786+
Disambiguators::Default(map) => map.remove(&def_id),
787+
Disambiguators::Delayed(map) => map.get(&def_id).map(Steal::steal),
788+
};
789+
790+
let new_disambig = new_disambig.unwrap_or_else(|| PerParentDisambiguatorState::new(def_id));
783791

784-
let new_disambig = self.resolver.steal_or_create_disambiguator(owner_id.def_id);
785-
let disambiguator = std::mem::replace(&mut self.disambiguator, new_disambig);
792+
let disambiguator = std::mem::replace(&mut self.current_disambiguator, new_disambig);
786793
let current_attrs = std::mem::take(&mut self.attrs);
787794
let current_bodies = std::mem::take(&mut self.bodies);
788795
let current_define_opaque = std::mem::take(&mut self.define_opaque);
@@ -817,7 +824,7 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
817824
assert!(self.impl_trait_bounds.is_empty());
818825
let info = self.make_owner_info(item);
819826

820-
self.disambiguator = disambiguator;
827+
self.current_disambiguator = disambiguator;
821828
self.attrs = current_attrs;
822829
self.bodies = current_bodies;
823830
self.define_opaque = current_define_opaque;

compiler/rustc_attr_parsing/src/attributes/crate_level.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
use rustc_errors::Diagnostic;
12
use rustc_hir::attrs::{CrateType, WindowsSubsystemKind};
2-
use rustc_hir::lints::AttributeLintKind;
33
use rustc_session::lint::builtin::UNKNOWN_CRATE_TYPES;
44
use rustc_span::Symbol;
55
use rustc_span::edit_distance::find_best_match_for_name;
66

77
use super::prelude::*;
8+
use crate::errors::{UnknownCrateTypes, UnknownCrateTypesSuggestion};
89

910
pub(crate) struct CrateNameParser;
1011

@@ -65,13 +66,17 @@ impl<S: Stage> CombineAttributeParser<S> for CrateTypeParser {
6566
crate_type,
6667
None,
6768
);
68-
cx.emit_lint(
69+
let span = n.value_span;
70+
cx.emit_dyn_lint(
6971
UNKNOWN_CRATE_TYPES,
70-
AttributeLintKind::CrateTypeUnknown {
71-
span: n.value_span,
72-
suggested: candidate,
72+
move |dcx, level| {
73+
UnknownCrateTypes {
74+
sugg: candidate
75+
.map(|s| UnknownCrateTypesSuggestion { span, snippet: s }),
76+
}
77+
.into_diag(dcx, level)
7378
},
74-
n.value_span,
79+
span,
7580
);
7681
}
7782
return None;

compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use rustc_errors::Diagnostic;
22
use rustc_feature::{AttributeTemplate, template};
33
use rustc_hir::Target;
44
use rustc_hir::attrs::AttributeKind;
5-
use rustc_hir::lints::AttributeLintKind;
65
use rustc_session::lint::builtin::{
76
MALFORMED_DIAGNOSTIC_ATTRIBUTES, MISPLACED_DIAGNOSTIC_ATTRIBUTES,
87
};
@@ -25,9 +24,9 @@ impl<S: Stage> SingleAttributeParser<S> for DoNotRecommendParser {
2524
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> {
2625
let attr_span = cx.attr_span;
2726
if !matches!(args, ArgParser::NoArgs) {
28-
cx.emit_lint(
27+
cx.emit_dyn_lint(
2928
MALFORMED_DIAGNOSTIC_ATTRIBUTES,
30-
AttributeLintKind::DoNotRecommendDoesNotExpectArgs,
29+
|dcx, level| crate::errors::DoNotRecommendDoesNotExpectArgs.into_diag(dcx, level),
3130
attr_span,
3231
);
3332
}

compiler/rustc_attr_parsing/src/attributes/doc.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ use super::prelude::{ALL_TARGETS, AllowedTargets};
1414
use super::{AcceptMapping, AttributeParser};
1515
use crate::context::{AcceptContext, FinalizeContext, Stage};
1616
use crate::errors::{
17-
DocAliasDuplicated, DocAutoCfgExpectsHideOrShow, DocAutoCfgHideShowExpectsList,
18-
DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral, DocUnknownAny, DocUnknownInclude,
17+
AttrCrateLevelOnly, DocAliasDuplicated, DocAutoCfgExpectsHideOrShow,
18+
DocAutoCfgHideShowExpectsList, DocAutoCfgHideShowUnexpectedItem, DocAutoCfgWrongLiteral,
19+
DocTestLiteral, DocTestTakesList, DocTestUnknown, DocUnknownAny, DocUnknownInclude,
1920
DocUnknownPasses, DocUnknownPlugins, DocUnknownSpotlight, IllFormedAttributeInput,
2021
};
2122
use crate::parser::{ArgParser, MetaItemOrLitParser, MetaItemParser, OwnedPathParser};
@@ -67,9 +68,9 @@ fn check_attr_not_crate_level<S: Stage>(
6768
/// Checks that an attribute is used at the crate level. Returns `true` if valid.
6869
fn check_attr_crate_level<S: Stage>(cx: &mut AcceptContext<'_, '_, S>, span: Span) -> bool {
6970
if cx.shared.target != Target::Crate {
70-
cx.emit_lint(
71+
cx.emit_dyn_lint(
7172
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
72-
AttributeLintKind::AttrCrateLevelOnly,
73+
|dcx, level| AttrCrateLevelOnly.into_diag(dcx, level),
7374
span,
7475
);
7576
return false;
@@ -216,16 +217,16 @@ impl DocParser {
216217
}
217218
}
218219
Some(name) => {
219-
cx.emit_lint(
220+
cx.emit_dyn_lint(
220221
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
221-
AttributeLintKind::DocTestUnknown { name },
222+
move |dcx, level| DocTestUnknown { name }.into_diag(dcx, level),
222223
path.span(),
223224
);
224225
}
225226
None => {
226-
cx.emit_lint(
227+
cx.emit_dyn_lint(
227228
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
228-
AttributeLintKind::DocTestLiteral,
229+
|dcx, level| DocTestLiteral.into_diag(dcx, level),
229230
path.span(),
230231
);
231232
}
@@ -587,9 +588,9 @@ impl DocParser {
587588
Some(sym::auto_cfg) => self.parse_auto_cfg(cx, path, args),
588589
Some(sym::test) => {
589590
let Some(list) = args.list() else {
590-
cx.emit_lint(
591+
cx.emit_dyn_lint(
591592
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
592-
AttributeLintKind::DocTestTakesList,
593+
|dcx, level| DocTestTakesList.into_diag(dcx, level),
593594
args.span().unwrap_or(path.span()),
594595
);
595596
return;

compiler/rustc_attr_parsing/src/errors.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,46 @@ pub(crate) struct DocUnknownAny {
253253
#[diag("expected boolean for `#[doc(auto_cfg = ...)]`")]
254254
pub(crate) struct DocAutoCfgWrongLiteral;
255255

256+
#[derive(Diagnostic)]
257+
#[diag("`#[doc(test(...)]` takes a list of attributes")]
258+
pub(crate) struct DocTestTakesList;
259+
260+
#[derive(Diagnostic)]
261+
#[diag("unknown `doc(test)` attribute `{$name}`")]
262+
pub(crate) struct DocTestUnknown {
263+
pub name: Symbol,
264+
}
265+
266+
#[derive(Diagnostic)]
267+
#[diag("`#![doc(test(...)]` does not take a literal")]
268+
pub(crate) struct DocTestLiteral;
269+
270+
#[derive(Diagnostic)]
271+
#[diag("this attribute can only be applied at the crate level")]
272+
#[note(
273+
"read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information"
274+
)]
275+
pub(crate) struct AttrCrateLevelOnly;
276+
277+
#[derive(Diagnostic)]
278+
#[diag("`#[diagnostic::do_not_recommend]` does not expect any arguments")]
279+
pub(crate) struct DoNotRecommendDoesNotExpectArgs;
280+
281+
#[derive(Diagnostic)]
282+
#[diag("invalid `crate_type` value")]
283+
pub(crate) struct UnknownCrateTypes {
284+
#[subdiagnostic]
285+
pub sugg: Option<UnknownCrateTypesSuggestion>,
286+
}
287+
288+
#[derive(Subdiagnostic)]
289+
#[suggestion("did you mean", code = r#""{snippet}""#, applicability = "maybe-incorrect")]
290+
pub(crate) struct UnknownCrateTypesSuggestion {
291+
#[primary_span]
292+
pub span: Span,
293+
pub snippet: Symbol,
294+
}
295+
256296
#[derive(Diagnostic)]
257297
#[diag("`#[diagnostic::on_const]` can only be applied to non-const trait implementations")]
258298
pub(crate) struct DiagnosticOnConstOnlyForTraitImpls {

compiler/rustc_borrowck/src/region_infer/opaque_types/member_constraints.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use rustc_data_structures::fx::FxHashMap;
22
use rustc_hir::def_id::DefId;
33
use rustc_middle::bug;
44
use rustc_middle::ty::{
5-
self, GenericArgsRef, Region, RegionVid, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable,
5+
self, Flags, GenericArgsRef, Region, RegionVid, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable,
66
TypeVisitor,
77
};
88
use tracing::{debug, instrument};

compiler/rustc_borrowck/src/region_infer/opaque_types/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_infer::traits::ObligationCause;
1010
use rustc_macros::extension;
1111
use rustc_middle::mir::{Body, ConstraintCategory};
1212
use rustc_middle::ty::{
13-
self, DefiningScopeKind, DefinitionSiteHiddenType, FallibleTypeFolder, GenericArg,
13+
self, DefiningScopeKind, DefinitionSiteHiddenType, FallibleTypeFolder, Flags, GenericArg,
1414
GenericArgsRef, OpaqueTypeKey, ProvisionalHiddenType, Region, RegionVid, Ty, TyCtxt,
1515
TypeFoldable, TypeSuperFoldable, TypeVisitableExt, Unnormalized, fold_regions,
1616
};

0 commit comments

Comments
 (0)