Rollup merge of #139662 - nnethercote:tweak-DefPathData, r=compiler-errors

Tweak `DefPathData`

Some improvements in and around `DefPathData`, following on from #137977.

r? `@spastorino`
This commit is contained in:
Jacob Pratt 2025-04-11 21:21:01 +02:00 committed by GitHub
commit 2b54f9bfb1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 48 additions and 44 deletions

View file

@ -267,11 +267,16 @@ impl DefKind {
| DefKind::ForeignTy | DefKind::ForeignTy
| DefKind::TraitAlias | DefKind::TraitAlias
| DefKind::TyParam | DefKind::TyParam
| DefKind::ExternCrate => DefPathData::TypeNs(Some(name.unwrap())), | DefKind::ExternCrate => DefPathData::TypeNs(name.unwrap()),
// An associated type names will be missing for an RPITIT. It will // An associated type name will be missing for an RPITIT.
// later be given a name with `synthetic` in it, if necessary. DefKind::AssocTy => {
DefKind::AssocTy => DefPathData::TypeNs(name), if let Some(name) = name {
DefPathData::TypeNs(name)
} else {
DefPathData::AnonAssocTy
}
}
// It's not exactly an anon const, but wrt DefPathData, there // It's not exactly an anon const, but wrt DefPathData, there
// is no difference. // is no difference.

View file

@ -271,9 +271,8 @@ pub enum DefPathData {
Use, Use,
/// A global asm item. /// A global asm item.
GlobalAsm, GlobalAsm,
/// Something in the type namespace. Will be empty for RPITIT associated /// Something in the type namespace.
/// types, which are given a synthetic name later, if necessary. TypeNs(Symbol),
TypeNs(Option<Symbol>),
/// Something in the value namespace. /// Something in the value namespace.
ValueNs(Symbol), ValueNs(Symbol),
/// Something in the macro namespace. /// Something in the macro namespace.
@ -291,6 +290,8 @@ pub enum DefPathData {
/// An existential `impl Trait` type node. /// An existential `impl Trait` type node.
/// Argument position `impl Trait` have a `TypeNs` with their pretty-printed name. /// Argument position `impl Trait` have a `TypeNs` with their pretty-printed name.
OpaqueTy, OpaqueTy,
/// An anonymous associated type from an RPITIT.
AnonAssocTy,
/// A synthetic body for a coroutine's by-move body. /// A synthetic body for a coroutine's by-move body.
SyntheticCoroutineBody, SyntheticCoroutineBody,
} }
@ -413,9 +414,7 @@ impl DefPathData {
pub fn get_opt_name(&self) -> Option<Symbol> { pub fn get_opt_name(&self) -> Option<Symbol> {
use self::DefPathData::*; use self::DefPathData::*;
match *self { match *self {
TypeNs(name) => name, TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
Impl Impl
| ForeignMod | ForeignMod
@ -426,6 +425,7 @@ impl DefPathData {
| Ctor | Ctor
| AnonConst | AnonConst
| OpaqueTy | OpaqueTy
| AnonAssocTy
| SyntheticCoroutineBody => None, | SyntheticCoroutineBody => None,
} }
} }
@ -433,14 +433,9 @@ impl DefPathData {
pub fn name(&self) -> DefPathDataName { pub fn name(&self) -> DefPathDataName {
use self::DefPathData::*; use self::DefPathData::*;
match *self { match *self {
TypeNs(name) => { TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => {
if let Some(name) = name {
DefPathDataName::Named(name) DefPathDataName::Named(name)
} else {
DefPathDataName::Anon { namespace: sym::synthetic }
} }
}
ValueNs(name) | MacroNs(name) | LifetimeNs(name) => DefPathDataName::Named(name),
// Note that this does not show up in user print-outs. // Note that this does not show up in user print-outs.
CrateRoot => DefPathDataName::Anon { namespace: kw::Crate }, CrateRoot => DefPathDataName::Anon { namespace: kw::Crate },
Impl => DefPathDataName::Anon { namespace: kw::Impl }, Impl => DefPathDataName::Anon { namespace: kw::Impl },
@ -451,6 +446,7 @@ impl DefPathData {
Ctor => DefPathDataName::Anon { namespace: sym::constructor }, Ctor => DefPathDataName::Anon { namespace: sym::constructor },
AnonConst => DefPathDataName::Anon { namespace: sym::constant }, AnonConst => DefPathDataName::Anon { namespace: sym::constant },
OpaqueTy => DefPathDataName::Anon { namespace: sym::opaque }, OpaqueTy => DefPathDataName::Anon { namespace: sym::opaque },
AnonAssocTy => DefPathDataName::Anon { namespace: sym::anon_assoc },
SyntheticCoroutineBody => DefPathDataName::Anon { namespace: sym::synthetic }, SyntheticCoroutineBody => DefPathDataName::Anon { namespace: sym::synthetic },
} }
} }

View file

@ -620,7 +620,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
// the children of the visible parent (as was done when computing // the children of the visible parent (as was done when computing
// `visible_parent_map`), looking for the specific child we currently have and then // `visible_parent_map`), looking for the specific child we currently have and then
// have access to the re-exported name. // have access to the re-exported name.
DefPathData::TypeNs(Some(ref mut name)) if Some(visible_parent) != actual_parent => { DefPathData::TypeNs(ref mut name) if Some(visible_parent) != actual_parent => {
// Item might be re-exported several times, but filter for the one // Item might be re-exported several times, but filter for the one
// that's public and whose identifier isn't `_`. // that's public and whose identifier isn't `_`.
let reexport = self let reexport = self
@ -641,7 +641,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
} }
// Re-exported `extern crate` (#43189). // Re-exported `extern crate` (#43189).
DefPathData::CrateRoot => { DefPathData::CrateRoot => {
data = DefPathData::TypeNs(Some(self.tcx().crate_name(def_id.krate))); data = DefPathData::TypeNs(self.tcx().crate_name(def_id.krate));
} }
_ => {} _ => {}
} }

View file

@ -26,7 +26,7 @@ fn true_significant_drop_ty<'tcx>(
name_rev.push(tcx.crate_name(did.krate)); name_rev.push(tcx.crate_name(did.krate));
} }
rustc_hir::definitions::DefPathData::TypeNs(symbol) => { rustc_hir::definitions::DefPathData::TypeNs(symbol) => {
name_rev.push(symbol.unwrap()); name_rev.push(symbol);
} }
_ => return None, _ => return None,
} }

View file

@ -1337,12 +1337,12 @@ impl<'tcx> Resolver<'_, 'tcx> {
expn_id: ExpnId, expn_id: ExpnId,
span: Span, span: Span,
) -> TyCtxtFeed<'tcx, LocalDefId> { ) -> TyCtxtFeed<'tcx, LocalDefId> {
let data = def_kind.def_path_data(name);
assert!( assert!(
!self.node_id_to_def_id.contains_key(&node_id), !self.node_id_to_def_id.contains_key(&node_id),
"adding a def'n for node-id {:?} and data {:?} but a previous def'n exists: {:?}", "adding a def for node-id {:?}, name {:?}, data {:?} but a previous def exists: {:?}",
node_id, node_id,
data, name,
def_kind,
self.tcx.definitions_untracked().def_key(self.node_id_to_def_id[&node_id].key()), self.tcx.definitions_untracked().def_key(self.node_id_to_def_id[&node_id].key()),
); );

View file

@ -721,7 +721,8 @@ fn encode_ty_name(tcx: TyCtxt<'_>, def_id: DefId) -> String {
| hir::definitions::DefPathData::Use | hir::definitions::DefPathData::Use
| hir::definitions::DefPathData::GlobalAsm | hir::definitions::DefPathData::GlobalAsm
| hir::definitions::DefPathData::MacroNs(..) | hir::definitions::DefPathData::MacroNs(..)
| hir::definitions::DefPathData::LifetimeNs(..) => { | hir::definitions::DefPathData::LifetimeNs(..)
| hir::definitions::DefPathData::AnonAssocTy => {
bug!("encode_ty_name: unexpected `{:?}`", disambiguated_data.data); bug!("encode_ty_name: unexpected `{:?}`", disambiguated_data.data);
} }
}); });

View file

@ -454,6 +454,7 @@ symbols! {
and_then, and_then,
anon, anon,
anon_adt, anon_adt,
anon_assoc,
anonymous_lifetime_in_impl_trait, anonymous_lifetime_in_impl_trait,
any, any,
append_const_msg, append_const_msg,

View file

@ -858,7 +858,8 @@ impl<'tcx> Printer<'tcx> for SymbolMangler<'tcx> {
| DefPathData::GlobalAsm | DefPathData::GlobalAsm
| DefPathData::Impl | DefPathData::Impl
| DefPathData::MacroNs(_) | DefPathData::MacroNs(_)
| DefPathData::LifetimeNs(_) => { | DefPathData::LifetimeNs(_)
| DefPathData::AnonAssocTy => {
bug!("symbol_names: unexpected DefPathData: {:?}", disambiguated_data.data) bug!("symbol_names: unexpected DefPathData: {:?}", disambiguated_data.data)
} }
}; };

View file

@ -252,7 +252,7 @@ fn associated_type_for_impl_trait_in_trait(
assert_eq!(tcx.def_kind(trait_def_id), DefKind::Trait); assert_eq!(tcx.def_kind(trait_def_id), DefKind::Trait);
let span = tcx.def_span(opaque_ty_def_id); let span = tcx.def_span(opaque_ty_def_id);
// No name because this is a synthetic associated type. // No name because this is an anonymous associated type.
let trait_assoc_ty = tcx.at(span).create_def(trait_def_id, None, DefKind::AssocTy); let trait_assoc_ty = tcx.at(span).create_def(trait_def_id, None, DefKind::AssocTy);
let local_def_id = trait_assoc_ty.def_id(); let local_def_id = trait_assoc_ty.def_id();
@ -305,7 +305,7 @@ fn associated_type_for_impl_trait_in_impl(
hir::FnRetTy::DefaultReturn(_) => tcx.def_span(impl_fn_def_id), hir::FnRetTy::DefaultReturn(_) => tcx.def_span(impl_fn_def_id),
hir::FnRetTy::Return(ty) => ty.span, hir::FnRetTy::Return(ty) => ty.span,
}; };
// No name because this is a synthetic associated type. // No name because this is an anonymous associated type.
let impl_assoc_ty = tcx.at(span).create_def(impl_local_def_id, None, DefKind::AssocTy); let impl_assoc_ty = tcx.at(span).create_def(impl_local_def_id, None, DefKind::AssocTy);
let local_def_id = impl_assoc_ty.def_id(); let local_def_id = impl_assoc_ty.def_id();

View file

@ -3504,7 +3504,7 @@ fn maybe_get_relative_path(from: &DefPath, to: &DefPath, max_super: usize) -> St
// a::b::c ::d::sym refers to // a::b::c ::d::sym refers to
// e::f::sym:: :: // e::f::sym:: ::
// result should be super::super::super::super::e::f // result should be super::super::super::super::e::f
if let DefPathData::TypeNs(Some(s)) = l { if let DefPathData::TypeNs(s) = l {
path.push(s.to_string()); path.push(s.to_string());
} }
if let DefPathData::TypeNs(_) = r { if let DefPathData::TypeNs(_) = r {
@ -3515,7 +3515,7 @@ fn maybe_get_relative_path(from: &DefPath, to: &DefPath, max_super: usize) -> St
// a::b::sym:: :: refers to // a::b::sym:: :: refers to
// c::d::e ::f::sym // c::d::e ::f::sym
// when looking at `f` // when looking at `f`
Left(DefPathData::TypeNs(Some(sym))) => path.push(sym.to_string()), Left(DefPathData::TypeNs(sym)) => path.push(sym.to_string()),
// consider: // consider:
// a::b::c ::d::sym refers to // a::b::c ::d::sym refers to
// e::f::sym:: :: // e::f::sym:: ::
@ -3529,7 +3529,7 @@ fn maybe_get_relative_path(from: &DefPath, to: &DefPath, max_super: usize) -> St
// `super` chain would be too long, just use the absolute path instead // `super` chain would be too long, just use the absolute path instead
once(String::from("crate")) once(String::from("crate"))
.chain(to.data.iter().filter_map(|el| { .chain(to.data.iter().filter_map(|el| {
if let DefPathData::TypeNs(Some(sym)) = el.data { if let DefPathData::TypeNs(sym) = el.data {
Some(sym.to_string()) Some(sym.to_string())
} else { } else {
None None

View file

@ -51,7 +51,7 @@ fn test_assoc_items() -> ControlFlow<()> {
check_items( check_items(
&trait_assoc_item_defs, &trait_assoc_item_defs,
&[ &[
"ATrait::{synthetic#0}", "ATrait::{anon_assoc#0}",
"ATrait::rpitit", "ATrait::rpitit",
"ATrait::Assoc", "ATrait::Assoc",
"ATrait::assoc_fn_no_self", "ATrait::assoc_fn_no_self",
@ -64,7 +64,7 @@ fn test_assoc_items() -> ControlFlow<()> {
check_items( check_items(
&impl_assoc_item_defs, &impl_assoc_item_defs,
&[ &[
"<AStruct as ATrait>::{synthetic#0}", "<AStruct as ATrait>::{anon_assoc#0}",
"<AStruct as ATrait>::rpitit", "<AStruct as ATrait>::rpitit",
"<AStruct as ATrait>::Assoc", "<AStruct as ATrait>::Assoc",
"<AStruct as ATrait>::assoc_fn_no_self", "<AStruct as ATrait>::assoc_fn_no_self",

View file

@ -1,4 +1,4 @@
error[E0391]: cycle detected when computing type of `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>::{synthetic#0}` error[E0391]: cycle detected when computing type of `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>::{anon_assoc#0}`
--> $DIR/unsupported.rs:22:25 --> $DIR/unsupported.rs:22:25
| |
LL | reuse to_reuse::opaque_ret; LL | reuse to_reuse::opaque_ret;
@ -9,7 +9,7 @@ note: ...which requires comparing an impl and trait method signature, inferring
| |
LL | reuse to_reuse::opaque_ret; LL | reuse to_reuse::opaque_ret;
| ^^^^^^^^^^ | ^^^^^^^^^^
= note: ...which again requires computing type of `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>::{synthetic#0}`, completing the cycle = note: ...which again requires computing type of `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>::{anon_assoc#0}`, completing the cycle
note: cycle used when checking that `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>` is well-formed note: cycle used when checking that `opaque::<impl at $DIR/unsupported.rs:21:5: 21:24>` is well-formed
--> $DIR/unsupported.rs:21:5 --> $DIR/unsupported.rs:21:5
| |
@ -17,7 +17,7 @@ LL | impl ToReuse for u8 {
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
error[E0391]: cycle detected when computing type of `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>::{synthetic#0}` error[E0391]: cycle detected when computing type of `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>::{anon_assoc#0}`
--> $DIR/unsupported.rs:25:24 --> $DIR/unsupported.rs:25:24
| |
LL | reuse ToReuse::opaque_ret; LL | reuse ToReuse::opaque_ret;
@ -28,7 +28,7 @@ note: ...which requires comparing an impl and trait method signature, inferring
| |
LL | reuse ToReuse::opaque_ret; LL | reuse ToReuse::opaque_ret;
| ^^^^^^^^^^ | ^^^^^^^^^^
= note: ...which again requires computing type of `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>::{synthetic#0}`, completing the cycle = note: ...which again requires computing type of `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>::{anon_assoc#0}`, completing the cycle
note: cycle used when checking that `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>` is well-formed note: cycle used when checking that `opaque::<impl at $DIR/unsupported.rs:24:5: 24:25>` is well-formed
--> $DIR/unsupported.rs:24:5 --> $DIR/unsupported.rs:24:5
| |

View file

@ -6,11 +6,11 @@ LL | fn bar() -> () {}
| |
= help: the trait `std::fmt::Display` is not implemented for `()` = help: the trait `std::fmt::Display` is not implemented for `()`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
note: required by a bound in `Foo::{synthetic#0}` note: required by a bound in `Foo::{anon_assoc#0}`
--> $DIR/doesnt-satisfy.rs:2:22 --> $DIR/doesnt-satisfy.rs:2:22
| |
LL | fn bar() -> impl std::fmt::Display; LL | fn bar() -> impl std::fmt::Display;
| ^^^^^^^^^^^^^^^^^ required by this bound in `Foo::{synthetic#0}` | ^^^^^^^^^^^^^^^^^ required by this bound in `Foo::{anon_assoc#0}`
error: aborting due to 1 previous error error: aborting due to 1 previous error

View file

@ -8,7 +8,7 @@ trait Foo {
} }
fn hello<'s, T: Foo>(x: &'s T) -> impl Sized + use<'s, T> { fn hello<'s, T: Foo>(x: &'s T) -> impl Sized + use<'s, T> {
//~^ ERROR <T as Foo>::{synthetic#0}<'s/#1> //~^ ERROR <T as Foo>::{anon_assoc#0}<'s/#1>
x.hello() x.hello()
} }

View file

@ -1,4 +1,4 @@
error: <T as Foo>::{synthetic#0}<'s/#1> error: <T as Foo>::{anon_assoc#0}<'s/#1>
--> $DIR/dump.rs:10:35 --> $DIR/dump.rs:10:35
| |
LL | fn hello<'s, T: Foo>(x: &'s T) -> impl Sized + use<'s, T> { LL | fn hello<'s, T: Foo>(x: &'s T) -> impl Sized + use<'s, T> {

View file

@ -14,11 +14,11 @@ LL | fn foo<F2: Foo<u8>>(self) -> impl Foo<u8> {
| ^^^^^^^^^^^^ the trait `Foo<char>` is not implemented for `impl Foo<u8>` | ^^^^^^^^^^^^ the trait `Foo<char>` is not implemented for `impl Foo<u8>`
| |
= help: the trait `Foo<char>` is implemented for `Bar` = help: the trait `Foo<char>` is implemented for `Bar`
note: required by a bound in `Foo::{synthetic#0}` note: required by a bound in `Foo::{anon_assoc#0}`
--> $DIR/return-dont-satisfy-bounds.rs:2:30 --> $DIR/return-dont-satisfy-bounds.rs:2:30
| |
LL | fn foo<F2>(self) -> impl Foo<T>; LL | fn foo<F2>(self) -> impl Foo<T>;
| ^^^^^^ required by this bound in `Foo::{synthetic#0}` | ^^^^^^ required by this bound in `Foo::{anon_assoc#0}`
error[E0277]: the trait bound `Bar: Foo<u8>` is not satisfied error[E0277]: the trait bound `Bar: Foo<u8>` is not satisfied
--> $DIR/return-dont-satisfy-bounds.rs:8:34 --> $DIR/return-dont-satisfy-bounds.rs:8:34

View file

@ -4,11 +4,11 @@ error[E0277]: the trait bound `Something: Termination` is not satisfied
LL | fn main() -> Something { LL | fn main() -> Something {
| ^^^^^^^^^ the trait `Termination` is not implemented for `Something` | ^^^^^^^^^ the trait `Termination` is not implemented for `Something`
| |
note: required by a bound in `Main::{synthetic#0}` note: required by a bound in `Main::{anon_assoc#0}`
--> $DIR/issue-103052-2.rs:3:27 --> $DIR/issue-103052-2.rs:3:27
| |
LL | fn main() -> impl std::process::Termination; LL | fn main() -> impl std::process::Termination;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Main::{synthetic#0}` | ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Main::{anon_assoc#0}`
error: aborting due to 1 previous error error: aborting due to 1 previous error