Use local key in providers

This commit is contained in:
Michael Goulet 2023-03-13 18:54:05 +00:00
parent a01b4cc9f3
commit 2eb1c08e43
65 changed files with 458 additions and 395 deletions

View file

@ -41,9 +41,7 @@ pub fn crates_export_threshold(crate_types: &[CrateType]) -> SymbolExportLevel {
} }
} }
fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<SymbolExportInfo> { fn reachable_non_generics_provider(tcx: TyCtxt<'_>, (): ()) -> DefIdMap<SymbolExportInfo> {
assert_eq!(cnum, LOCAL_CRATE);
if !tcx.sess.opts.output_types.should_codegen() { if !tcx.sess.opts.output_types.should_codegen() {
return Default::default(); return Default::default();
} }
@ -154,10 +152,10 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, cnum: CrateNum) -> DefIdMap<
reachable_non_generics reachable_non_generics
} }
fn is_reachable_non_generic_provider_local(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn is_reachable_non_generic_provider_local(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
let export_threshold = threshold(tcx); let export_threshold = threshold(tcx);
if let Some(&info) = tcx.reachable_non_generics(def_id.krate).get(&def_id) { if let Some(&info) = tcx.reachable_non_generics(LOCAL_CRATE).get(&def_id.to_def_id()) {
info.level.is_below_threshold(export_threshold) info.level.is_below_threshold(export_threshold)
} else { } else {
false false
@ -170,10 +168,8 @@ fn is_reachable_non_generic_provider_extern(tcx: TyCtxt<'_>, def_id: DefId) -> b
fn exported_symbols_provider_local( fn exported_symbols_provider_local(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
cnum: CrateNum, (): (),
) -> &[(ExportedSymbol<'_>, SymbolExportInfo)] { ) -> &[(ExportedSymbol<'_>, SymbolExportInfo)] {
assert_eq!(cnum, LOCAL_CRATE);
if !tcx.sess.opts.output_types.should_codegen() { if !tcx.sess.opts.output_types.should_codegen() {
return &[]; return &[];
} }

View file

@ -43,7 +43,7 @@ fn linkage_by_name(tcx: TyCtxt<'_>, def_id: LocalDefId, name: &str) -> Linkage {
} }
} }
fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs { fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
if cfg!(debug_assertions) { if cfg!(debug_assertions) {
let def_kind = tcx.def_kind(did); let def_kind = tcx.def_kind(did);
assert!( assert!(
@ -52,7 +52,6 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: DefId) -> CodegenFnAttrs {
); );
} }
let did = did.expect_local();
let attrs = tcx.hir().attrs(tcx.hir().local_def_id_to_hir_id(did)); let attrs = tcx.hir().attrs(tcx.hir().local_def_id_to_hir_id(did));
let mut codegen_fn_attrs = CodegenFnAttrs::new(); let mut codegen_fn_attrs = CodegenFnAttrs::new();
if tcx.should_inherit_track_caller(did) { if tcx.should_inherit_track_caller(did) {

View file

@ -32,8 +32,7 @@ pub fn is_parent_const_impl_raw(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
/// it is a trait impl/function, return if it has a `const` modifier. If it is an intrinsic, /// it is a trait impl/function, return if it has a `const` modifier. If it is an intrinsic,
/// report whether said intrinsic has a `rustc_const_{un,}stable` attribute. Otherwise, return /// report whether said intrinsic has a `rustc_const_{un,}stable` attribute. Otherwise, return
/// `Constness::NotConst`. /// `Constness::NotConst`.
fn constness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Constness { fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
let def_id = def_id.expect_local();
let node = tcx.hir().get_by_def_id(def_id); let node = tcx.hir().get_by_def_id(def_id);
match node { match node {

View file

@ -246,7 +246,7 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
self.check_local_or_return_ty(return_ty.skip_binder(), RETURN_PLACE); self.check_local_or_return_ty(return_ty.skip_binder(), RETURN_PLACE);
} }
if !tcx.has_attr(def_id.to_def_id(), sym::rustc_do_not_const_check) { if !tcx.has_attr(def_id, sym::rustc_do_not_const_check) {
self.visit_body(&body); self.visit_body(&body);
} }

View file

@ -30,7 +30,7 @@ pub fn check_live_drops<'tcx>(tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>) {
return; return;
} }
if tcx.has_attr(def_id.to_def_id(), sym::rustc_do_not_const_check) { if tcx.has_attr(def_id, sym::rustc_do_not_const_check) {
return; return;
} }

View file

@ -22,6 +22,12 @@ impl From<OwnerId> for HirId {
} }
} }
impl From<OwnerId> for DefId {
fn from(value: OwnerId) -> Self {
value.to_def_id()
}
}
impl OwnerId { impl OwnerId {
#[inline] #[inline]
pub fn to_def_id(self) -> DefId { pub fn to_def_id(self) -> DefId {

View file

@ -1161,7 +1161,7 @@ fn check_enum(tcx: TyCtxt<'_>, def_id: LocalDefId) {
def.destructor(tcx); // force the destructor to be evaluated def.destructor(tcx); // force the destructor to be evaluated
if def.variants().is_empty() { if def.variants().is_empty() {
if let Some(attr) = tcx.get_attrs(def_id.to_def_id(), sym::repr).next() { if let Some(attr) = tcx.get_attrs(def_id, sym::repr).next() {
struct_span_err!( struct_span_err!(
tcx.sess, tcx.sess,
attr.span, attr.span,

View file

@ -583,13 +583,13 @@ fn compare_asyncness<'tcx>(
#[instrument(skip(tcx), level = "debug", ret)] #[instrument(skip(tcx), level = "debug", ret)]
pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>( pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
def_id: DefId, impl_m_def_id: LocalDefId,
) -> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed> { ) -> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed> {
let impl_m = tcx.opt_associated_item(def_id).unwrap(); let impl_m = tcx.opt_associated_item(impl_m_def_id.to_def_id()).unwrap();
let trait_m = tcx.opt_associated_item(impl_m.trait_item_def_id.unwrap()).unwrap(); let trait_m = tcx.opt_associated_item(impl_m.trait_item_def_id.unwrap()).unwrap();
let impl_trait_ref = let impl_trait_ref =
tcx.impl_trait_ref(impl_m.impl_container(tcx).unwrap()).unwrap().subst_identity(); tcx.impl_trait_ref(impl_m.impl_container(tcx).unwrap()).unwrap().subst_identity();
let param_env = tcx.param_env(def_id); let param_env = tcx.param_env(impl_m_def_id);
// First, check a few of the same things as `compare_impl_method`, // First, check a few of the same things as `compare_impl_method`,
// just so we don't ICE during substitution later. // just so we don't ICE during substitution later.
@ -599,7 +599,6 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
let trait_to_impl_substs = impl_trait_ref.substs; let trait_to_impl_substs = impl_trait_ref.substs;
let impl_m_def_id = impl_m.def_id.expect_local();
let impl_m_hir_id = tcx.hir().local_def_id_to_hir_id(impl_m_def_id); let impl_m_hir_id = tcx.hir().local_def_id_to_hir_id(impl_m_def_id);
let return_span = tcx.hir().fn_decl_by_hir_id(impl_m_hir_id).unwrap().output.span(); let return_span = tcx.hir().fn_decl_by_hir_id(impl_m_hir_id).unwrap().output.span();
let cause = ObligationCause::new( let cause = ObligationCause::new(

View file

@ -109,8 +109,8 @@ pub fn provide(providers: &mut Providers) {
}; };
} }
fn adt_destructor(tcx: TyCtxt<'_>, def_id: DefId) -> Option<ty::Destructor> { fn adt_destructor(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<ty::Destructor> {
tcx.calculate_dtor(def_id, dropck::check_drop_impl) tcx.calculate_dtor(def_id.to_def_id(), dropck::check_drop_impl)
} }
/// Given a `DefId` for an opaque type in return position, find its parent item's return /// Given a `DefId` for an opaque type in return position, find its parent item's return

View file

@ -368,11 +368,8 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef
} }
} }
pub fn coerce_unsized_info<'tcx>(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUnsizedInfo { pub fn coerce_unsized_info<'tcx>(tcx: TyCtxt<'tcx>, impl_did: LocalDefId) -> CoerceUnsizedInfo {
debug!("compute_coerce_unsized_info(impl_did={:?})", impl_did); debug!("compute_coerce_unsized_info(impl_did={:?})", impl_did);
// this provider should only get invoked for local def-ids
let impl_did = impl_did.expect_local();
let span = tcx.def_span(impl_did); let span = tcx.def_span(impl_did);
let coerce_unsized_trait = tcx.require_lang_item(LangItem::CoerceUnsized, Some(span)); let coerce_unsized_trait = tcx.require_lang_item(LangItem::CoerceUnsized, Some(span));

View file

@ -10,7 +10,7 @@
use rustc_errors::struct_span_err; use rustc_errors::struct_span_err;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_middle::ty::fast_reject::{simplify_type, SimplifiedType, TreatParams, TreatProjections}; use rustc_middle::ty::fast_reject::{simplify_type, SimplifiedType, TreatParams, TreatProjections};
use rustc_middle::ty::{self, CrateInherentImpls, Ty, TyCtxt}; use rustc_middle::ty::{self, CrateInherentImpls, Ty, TyCtxt};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
@ -24,7 +24,7 @@ pub fn crate_inherent_impls(tcx: TyCtxt<'_>, (): ()) -> CrateInherentImpls {
collect.impls_map collect.impls_map
} }
pub fn crate_incoherent_impls(tcx: TyCtxt<'_>, (_, simp): (CrateNum, SimplifiedType)) -> &[DefId] { pub fn crate_incoherent_impls(tcx: TyCtxt<'_>, simp: SimplifiedType) -> &[DefId] {
let crate_map = tcx.crate_inherent_impls(()); let crate_map = tcx.crate_inherent_impls(());
tcx.arena.alloc_from_iter( tcx.arena.alloc_from_iter(
crate_map.incoherent_impls.get(&simp).unwrap_or(&Vec::new()).iter().map(|d| d.to_def_id()), crate_map.incoherent_impls.get(&simp).unwrap_or(&Vec::new()).iter().map(|d| d.to_def_id()),
@ -32,9 +32,7 @@ pub fn crate_incoherent_impls(tcx: TyCtxt<'_>, (_, simp): (CrateNum, SimplifiedT
} }
/// On-demand query: yields a vector of the inherent impls for a specific type. /// On-demand query: yields a vector of the inherent impls for a specific type.
pub fn inherent_impls(tcx: TyCtxt<'_>, ty_def_id: DefId) -> &[DefId] { pub fn inherent_impls(tcx: TyCtxt<'_>, ty_def_id: LocalDefId) -> &[DefId] {
let ty_def_id = ty_def_id.expect_local();
let crate_map = tcx.crate_inherent_impls(()); let crate_map = tcx.crate_inherent_impls(());
match crate_map.inherent_impls.get(&ty_def_id) { match crate_map.inherent_impls.get(&ty_def_id) {
Some(v) => &v[..], Some(v) => &v[..],

View file

@ -839,17 +839,15 @@ fn convert_variant(
adt_kind, adt_kind,
parent_did.to_def_id(), parent_did.to_def_id(),
recovered, recovered,
adt_kind == AdtKind::Struct && tcx.has_attr(parent_did.to_def_id(), sym::non_exhaustive) adt_kind == AdtKind::Struct && tcx.has_attr(parent_did, sym::non_exhaustive)
|| variant_did.map_or(false, |variant_did| { || variant_did
tcx.has_attr(variant_did.to_def_id(), sym::non_exhaustive) .map_or(false, |variant_did| tcx.has_attr(variant_did, sym::non_exhaustive)),
}),
) )
} }
fn adt_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AdtDef<'_> { fn adt_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AdtDef<'_> {
use rustc_hir::*; use rustc_hir::*;
let def_id = def_id.expect_local();
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
let Node::Item(item) = tcx.hir().get(hir_id) else { let Node::Item(item) = tcx.hir().get(hir_id) else {
bug!(); bug!();
@ -908,8 +906,8 @@ fn adt_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AdtDef<'_> {
tcx.mk_adt_def(def_id.to_def_id(), kind, variants, repr) tcx.mk_adt_def(def_id.to_def_id(), kind, variants, repr)
} }
fn trait_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::TraitDef { fn trait_def(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::TraitDef {
let item = tcx.hir().expect_item(def_id.expect_local()); let item = tcx.hir().expect_item(def_id);
let (is_auto, unsafety, items) = match item.kind { let (is_auto, unsafety, items) = match item.kind {
hir::ItemKind::Trait(is_auto, unsafety, .., items) => { hir::ItemKind::Trait(is_auto, unsafety, .., items) => {
@ -1036,7 +1034,7 @@ fn trait_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::TraitDef {
}); });
ty::TraitDef { ty::TraitDef {
def_id, def_id: def_id.to_def_id(),
unsafety, unsafety,
paren_sugar, paren_sugar,
has_auto_impl: is_auto, has_auto_impl: is_auto,
@ -1091,11 +1089,10 @@ pub fn get_infer_ret_ty<'hir>(output: &'hir hir::FnRetTy<'hir>) -> Option<&'hir
} }
#[instrument(level = "debug", skip(tcx))] #[instrument(level = "debug", skip(tcx))]
fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::EarlyBinder<ty::PolyFnSig<'_>> { fn fn_sig(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<ty::PolyFnSig<'_>> {
use rustc_hir::Node::*; use rustc_hir::Node::*;
use rustc_hir::*; use rustc_hir::*;
let def_id = def_id.expect_local();
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
let icx = ItemCtxt::new(tcx, def_id.to_def_id()); let icx = ItemCtxt::new(tcx, def_id.to_def_id());
@ -1338,9 +1335,12 @@ fn suggest_impl_trait<'tcx>(
None None
} }
fn impl_trait_ref(tcx: TyCtxt<'_>, def_id: DefId) -> Option<ty::EarlyBinder<ty::TraitRef<'_>>> { fn impl_trait_ref(
let icx = ItemCtxt::new(tcx, def_id); tcx: TyCtxt<'_>,
let impl_ = tcx.hir().expect_item(def_id.expect_local()).expect_impl(); def_id: LocalDefId,
) -> Option<ty::EarlyBinder<ty::TraitRef<'_>>> {
let icx = ItemCtxt::new(tcx, def_id.to_def_id());
let impl_ = tcx.hir().expect_item(def_id).expect_impl();
impl_ impl_
.of_trait .of_trait
.as_ref() .as_ref()
@ -1380,9 +1380,9 @@ fn check_impl_constness(
} }
} }
fn impl_polarity(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ImplPolarity { fn impl_polarity(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::ImplPolarity {
let is_rustc_reservation = tcx.has_attr(def_id, sym::rustc_reservation_impl); let is_rustc_reservation = tcx.has_attr(def_id, sym::rustc_reservation_impl);
let item = tcx.hir().expect_item(def_id.expect_local()); let item = tcx.hir().expect_item(def_id);
match &item.kind { match &item.kind {
hir::ItemKind::Impl(hir::Impl { hir::ItemKind::Impl(hir::Impl {
polarity: hir::ImplPolarity::Negative(span), polarity: hir::ImplPolarity::Negative(span),
@ -1515,31 +1515,28 @@ fn compute_sig_of_foreign_fn_decl<'tcx>(
fty fty
} }
fn is_foreign_item(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn is_foreign_item(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
match tcx.hir().get_if_local(def_id) { match tcx.hir().get_by_def_id(def_id) {
Some(Node::ForeignItem(..)) => true, Node::ForeignItem(..) => true,
Some(_) => false, _ => false,
_ => bug!("is_foreign_item applied to non-local def-id {:?}", def_id),
} }
} }
fn generator_kind(tcx: TyCtxt<'_>, def_id: DefId) -> Option<hir::GeneratorKind> { fn generator_kind(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option<hir::GeneratorKind> {
match tcx.hir().get_if_local(def_id) { match tcx.hir().get_by_def_id(def_id) {
Some(Node::Expr(&rustc_hir::Expr { Node::Expr(&rustc_hir::Expr {
kind: rustc_hir::ExprKind::Closure(&rustc_hir::Closure { body, .. }), kind: rustc_hir::ExprKind::Closure(&rustc_hir::Closure { body, .. }),
.. ..
})) => tcx.hir().body(body).generator_kind(), }) => tcx.hir().body(body).generator_kind(),
Some(_) => None, _ => None,
_ => bug!("generator_kind applied to non-local def-id {:?}", def_id),
} }
} }
fn is_type_alias_impl_trait<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { fn is_type_alias_impl_trait<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> bool {
match tcx.hir().get_if_local(def_id) { match tcx.hir().get_by_def_id(def_id) {
Some(Node::Item(hir::Item { kind: hir::ItemKind::OpaqueTy(opaque), .. })) => { Node::Item(hir::Item { kind: hir::ItemKind::OpaqueTy(opaque), .. }) => {
matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias) matches!(opaque.origin, hir::OpaqueTyOrigin::TyAlias)
} }
Some(_) => bug!("tried getting opaque_ty_origin for non-opaque: {:?}", def_id), _ => bug!("tried getting opaque_ty_origin for non-opaque: {:?}", def_id),
_ => bug!("tried getting opaque_ty_origin for non-local def-id {:?}", def_id),
} }
} }

View file

@ -5,16 +5,16 @@ use hir::{
}; };
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::LocalDefId;
use rustc_middle::ty::{self, TyCtxt}; use rustc_middle::ty::{self, TyCtxt};
use rustc_session::lint; use rustc_session::lint;
use rustc_span::symbol::{kw, Symbol}; use rustc_span::symbol::{kw, Symbol};
use rustc_span::Span; use rustc_span::Span;
pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
use rustc_hir::*; use rustc_hir::*;
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(hir_id); let node = tcx.hir().get(hir_id);
let parent_def_id = match node { let parent_def_id = match node {
@ -121,7 +121,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
Some(parent_def_id.to_def_id()) Some(parent_def_id.to_def_id())
} }
Node::Expr(&Expr { kind: ExprKind::ConstBlock(_), .. }) => { Node::Expr(&Expr { kind: ExprKind::ConstBlock(_), .. }) => {
Some(tcx.typeck_root_def_id(def_id)) Some(tcx.typeck_root_def_id(def_id.to_def_id()))
} }
// Exclude `GlobalAsm` here which cannot have generics. // Exclude `GlobalAsm` here which cannot have generics.
Node::Expr(&Expr { kind: ExprKind::InlineAsm(asm), .. }) Node::Expr(&Expr { kind: ExprKind::InlineAsm(asm), .. })
@ -140,7 +140,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
} }
} }
Node::Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => { Node::Expr(&hir::Expr { kind: hir::ExprKind::Closure { .. }, .. }) => {
Some(tcx.typeck_root_def_id(def_id)) Some(tcx.typeck_root_def_id(def_id.to_def_id()))
} }
Node::Item(item) => match item.kind { Node::Item(item) => match item.kind {
ItemKind::OpaqueTy(hir::OpaqueTy { ItemKind::OpaqueTy(hir::OpaqueTy {
@ -189,7 +189,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
let opt_self = Some(ty::GenericParamDef { let opt_self = Some(ty::GenericParamDef {
index: 0, index: 0,
name: kw::SelfUpper, name: kw::SelfUpper,
def_id, def_id: def_id.to_def_id(),
pure_wrt_drop: false, pure_wrt_drop: false,
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {
has_default: false, has_default: false,
@ -326,7 +326,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
params.extend(dummy_args.iter().map(|&arg| ty::GenericParamDef { params.extend(dummy_args.iter().map(|&arg| ty::GenericParamDef {
index: next_index(), index: next_index(),
name: Symbol::intern(arg), name: Symbol::intern(arg),
def_id, def_id: def_id.to_def_id(),
pure_wrt_drop: false, pure_wrt_drop: false,
kind: ty::GenericParamDefKind::Type { has_default: false, synthetic: false }, kind: ty::GenericParamDefKind::Type { has_default: false, synthetic: false },
})); }));
@ -339,7 +339,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
params.push(ty::GenericParamDef { params.push(ty::GenericParamDef {
index: next_index(), index: next_index(),
name: Symbol::intern("<const_ty>"), name: Symbol::intern("<const_ty>"),
def_id, def_id: def_id.to_def_id(),
pure_wrt_drop: false, pure_wrt_drop: false,
kind: ty::GenericParamDefKind::Type { has_default: false, synthetic: false }, kind: ty::GenericParamDefKind::Type { has_default: false, synthetic: false },
}); });

View file

@ -4,7 +4,7 @@ use rustc_hir as hir;
use rustc_infer::traits::util; use rustc_infer::traits::util;
use rustc_middle::ty::subst::InternalSubsts; use rustc_middle::ty::subst::InternalSubsts;
use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::ty::{self, Ty, TyCtxt};
use rustc_span::def_id::DefId; use rustc_span::def_id::{DefId, LocalDefId};
use rustc_span::Span; use rustc_span::Span;
/// For associated types we include both bounds written on the type /// For associated types we include both bounds written on the type
@ -74,9 +74,9 @@ fn opaque_type_bounds<'tcx>(
pub(super) fn explicit_item_bounds( pub(super) fn explicit_item_bounds(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
def_id: DefId, def_id: LocalDefId,
) -> &'_ [(ty::Predicate<'_>, Span)] { ) -> &'_ [(ty::Predicate<'_>, Span)] {
match tcx.opt_rpitit_info(def_id) { match tcx.opt_rpitit_info(def_id.to_def_id()) {
// RPITIT's bounds are the same as opaque type bounds, but with // RPITIT's bounds are the same as opaque type bounds, but with
// a projection self type. // a projection self type.
Some(ty::ImplTraitInTraitData::Trait { opaque_def_id, .. }) => { Some(ty::ImplTraitInTraitData::Trait { opaque_def_id, .. }) => {
@ -86,7 +86,10 @@ pub(super) fn explicit_item_bounds(
tcx, tcx,
opaque_def_id, opaque_def_id,
opaque_ty.bounds, opaque_ty.bounds,
tcx.mk_projection(def_id, ty::InternalSubsts::identity_for_item(tcx, def_id)), tcx.mk_projection(
def_id.to_def_id(),
ty::InternalSubsts::identity_for_item(tcx, def_id.to_def_id()),
),
item.span, item.span,
); );
} }
@ -95,25 +98,25 @@ pub(super) fn explicit_item_bounds(
None => {} None => {}
} }
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
match tcx.hir().get(hir_id) { match tcx.hir().get(hir_id) {
hir::Node::TraitItem(hir::TraitItem { hir::Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Type(bounds, _), kind: hir::TraitItemKind::Type(bounds, _),
span, span,
.. ..
}) => associated_type_bounds(tcx, def_id, bounds, *span), }) => associated_type_bounds(tcx, def_id.to_def_id(), bounds, *span),
hir::Node::Item(hir::Item { hir::Node::Item(hir::Item {
kind: hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds, in_trait, .. }), kind: hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds, in_trait, .. }),
span, span,
.. ..
}) => { }) => {
let substs = InternalSubsts::identity_for_item(tcx, def_id); let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
let item_ty = if *in_trait && !tcx.lower_impl_trait_in_trait_to_assoc_ty() { let item_ty = if *in_trait && !tcx.lower_impl_trait_in_trait_to_assoc_ty() {
tcx.mk_projection(def_id, substs) tcx.mk_projection(def_id.to_def_id(), substs)
} else { } else {
tcx.mk_opaque(def_id, substs) tcx.mk_opaque(def_id.to_def_id(), substs)
}; };
opaque_type_bounds(tcx, def_id, bounds, item_ty, *span) opaque_type_bounds(tcx, def_id.to_def_id(), bounds, item_ty, *span)
} }
_ => bug!("item_bounds called on {:?}", def_id), _ => bug!("item_bounds called on {:?}", def_id),
} }

View file

@ -62,16 +62,17 @@ pub(super) fn predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredic
/// Returns a list of user-specified type predicates for the definition with ID `def_id`. /// Returns a list of user-specified type predicates for the definition with ID `def_id`.
/// N.B., this does not include any implied/inferred constraints. /// N.B., this does not include any implied/inferred constraints.
#[instrument(level = "trace", skip(tcx), ret)] #[instrument(level = "trace", skip(tcx), ret)]
fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicates<'_> { fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::GenericPredicates<'_> {
use rustc_hir::*; use rustc_hir::*;
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
let node = tcx.hir().get(hir_id); let node = tcx.hir().get(hir_id);
let mut is_trait = None; let mut is_trait = None;
let mut is_default_impl_trait = None; let mut is_default_impl_trait = None;
let icx = ItemCtxt::new(tcx, def_id); // FIXME: Should ItemCtxt take a LocalDefId?
let icx = ItemCtxt::new(tcx, def_id.to_def_id());
const NO_GENERICS: &hir::Generics<'_> = hir::Generics::empty(); const NO_GENERICS: &hir::Generics<'_> = hir::Generics::empty();
@ -99,7 +100,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
| ItemKind::Union(_, generics) => generics, | ItemKind::Union(_, generics) => generics,
ItemKind::Trait(_, _, generics, ..) | ItemKind::TraitAlias(generics, _) => { ItemKind::Trait(_, _, generics, ..) | ItemKind::TraitAlias(generics, _) => {
is_trait = Some(ty::TraitRef::identity(tcx, def_id)); is_trait = Some(ty::TraitRef::identity(tcx, def_id.to_def_id()));
generics generics
} }
ItemKind::OpaqueTy(OpaqueTy { generics, .. }) => generics, ItemKind::OpaqueTy(OpaqueTy { generics, .. }) => generics,
@ -253,7 +254,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP
} }
if tcx.features().generic_const_exprs { if tcx.features().generic_const_exprs {
predicates.extend(const_evaluatable_predicates_of(tcx, def_id.expect_local())); predicates.extend(const_evaluatable_predicates_of(tcx, def_id));
} }
let mut predicates: Vec<_> = predicates.into_iter().collect(); let mut predicates: Vec<_> = predicates.into_iter().collect();
@ -392,19 +393,19 @@ pub(super) fn trait_explicit_predicates_and_bounds(
def_id: LocalDefId, def_id: LocalDefId,
) -> ty::GenericPredicates<'_> { ) -> ty::GenericPredicates<'_> {
assert_eq!(tcx.def_kind(def_id), DefKind::Trait); assert_eq!(tcx.def_kind(def_id), DefKind::Trait);
gather_explicit_predicates_of(tcx, def_id.to_def_id()) gather_explicit_predicates_of(tcx, def_id)
} }
pub(super) fn explicit_predicates_of<'tcx>( pub(super) fn explicit_predicates_of<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
def_id: DefId, def_id: LocalDefId,
) -> ty::GenericPredicates<'tcx> { ) -> ty::GenericPredicates<'tcx> {
let def_kind = tcx.def_kind(def_id); let def_kind = tcx.def_kind(def_id);
if let DefKind::Trait = def_kind { if let DefKind::Trait = def_kind {
// Remove bounds on associated types from the predicates, they will be // Remove bounds on associated types from the predicates, they will be
// returned by `explicit_item_bounds`. // returned by `explicit_item_bounds`.
let predicates_and_bounds = tcx.trait_explicit_predicates_and_bounds(def_id.expect_local()); let predicates_and_bounds = tcx.trait_explicit_predicates_and_bounds(def_id);
let trait_identity_substs = InternalSubsts::identity_for_item(tcx, def_id); let trait_identity_substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id());
let is_assoc_item_ty = |ty: Ty<'tcx>| { let is_assoc_item_ty = |ty: Ty<'tcx>| {
// For a predicate from a where clause to become a bound on an // For a predicate from a where clause to become a bound on an
@ -418,7 +419,8 @@ pub(super) fn explicit_predicates_of<'tcx>(
// supertrait). // supertrait).
if let ty::Alias(ty::Projection, projection) = ty.kind() { if let ty::Alias(ty::Projection, projection) = ty.kind() {
projection.substs == trait_identity_substs projection.substs == trait_identity_substs
&& tcx.associated_item(projection.def_id).container_id(tcx) == def_id && tcx.associated_item(projection.def_id).container_id(tcx)
== def_id.to_def_id()
} else { } else {
false false
} }
@ -449,7 +451,7 @@ pub(super) fn explicit_predicates_of<'tcx>(
} }
} else { } else {
if matches!(def_kind, DefKind::AnonConst) && tcx.lazy_normalization() { if matches!(def_kind, DefKind::AnonConst) && tcx.lazy_normalization() {
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
let parent_def_id = tcx.hir().get_parent_item(hir_id); let parent_def_id = tcx.hir().get_parent_item(hir_id);
if let Some(defaulted_param_def_id) = if let Some(defaulted_param_def_id) =
@ -537,9 +539,9 @@ pub(super) fn explicit_predicates_of<'tcx>(
/// the transitive super-predicates are converted. /// the transitive super-predicates are converted.
pub(super) fn super_predicates_of( pub(super) fn super_predicates_of(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
trait_def_id: DefId, trait_def_id: LocalDefId,
) -> ty::GenericPredicates<'_> { ) -> ty::GenericPredicates<'_> {
tcx.super_predicates_that_define_assoc_type((trait_def_id, None)) tcx.super_predicates_that_define_assoc_type((trait_def_id.to_def_id(), None))
} }
/// Ensures that the super-predicates of the trait with a `DefId` /// Ensures that the super-predicates of the trait with a `DefId`

View file

@ -1051,9 +1051,8 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
} }
} }
fn object_lifetime_default(tcx: TyCtxt<'_>, param_def_id: DefId) -> ObjectLifetimeDefault { fn object_lifetime_default(tcx: TyCtxt<'_>, param_def_id: LocalDefId) -> ObjectLifetimeDefault {
debug_assert_eq!(tcx.def_kind(param_def_id), DefKind::TyParam); debug_assert_eq!(tcx.def_kind(param_def_id), DefKind::TyParam);
let param_def_id = param_def_id.expect_local();
let hir::Node::GenericParam(param) = tcx.hir().get_by_def_id(param_def_id) else { let hir::Node::GenericParam(param) = tcx.hir().get_by_def_id(param_def_id) else {
bug!("expected GenericParam for object_lifetime_default"); bug!("expected GenericParam for object_lifetime_default");
}; };

View file

@ -244,11 +244,13 @@ fn get_path_containing_arg_in_pat<'hir>(
arg_path arg_path
} }
pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::EarlyBinder<Ty<'_>> { pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Ty<'_>> {
// If we are computing `type_of` the synthesized associated type for an RPITIT in the impl // If we are computing `type_of` the synthesized associated type for an RPITIT in the impl
// side, use `collect_return_position_impl_trait_in_trait_tys` to infer the value of the // side, use `collect_return_position_impl_trait_in_trait_tys` to infer the value of the
// associated type in the impl. // associated type in the impl.
if let Some(ImplTraitInTraitData::Impl { fn_def_id, .. }) = tcx.opt_rpitit_info(def_id) { if let Some(ImplTraitInTraitData::Impl { fn_def_id, .. }) =
tcx.opt_rpitit_info(def_id.to_def_id())
{
match tcx.collect_return_position_impl_trait_in_trait_tys(fn_def_id) { match tcx.collect_return_position_impl_trait_in_trait_tys(fn_def_id) {
Ok(map) => { Ok(map) => {
let assoc_item = tcx.associated_item(def_id); let assoc_item = tcx.associated_item(def_id);
@ -263,7 +265,6 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::EarlyBinder<Ty<'_>>
} }
} }
let def_id = def_id.expect_local();
use rustc_hir::*; use rustc_hir::*;
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);

View file

@ -1,6 +1,6 @@
use hir::Node; use hir::Node;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::LocalDefId;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::subst::GenericArgKind; use rustc_middle::ty::subst::GenericArgKind;
use rustc_middle::ty::{self, CratePredicatesMap, TyCtxt}; use rustc_middle::ty::{self, CratePredicatesMap, TyCtxt};
@ -17,8 +17,8 @@ pub fn provide(providers: &mut Providers) {
*providers = Providers { inferred_outlives_of, inferred_outlives_crate, ..*providers }; *providers = Providers { inferred_outlives_of, inferred_outlives_crate, ..*providers };
} }
fn inferred_outlives_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[(ty::Clause<'_>, Span)] { fn inferred_outlives_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[(ty::Clause<'_>, Span)] {
let id = tcx.hir().local_def_id_to_hir_id(item_def_id.expect_local()); let id = tcx.hir().local_def_id_to_hir_id(item_def_id);
if matches!(tcx.def_kind(item_def_id), hir::def::DefKind::AnonConst) && tcx.lazy_normalization() if matches!(tcx.def_kind(item_def_id), hir::def::DefKind::AnonConst) && tcx.lazy_normalization()
{ {
@ -45,7 +45,8 @@ fn inferred_outlives_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[(ty::Clause<'_
hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => { hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => {
let crate_map = tcx.inferred_outlives_crate(()); let crate_map = tcx.inferred_outlives_crate(());
let predicates = crate_map.predicates.get(&item_def_id).copied().unwrap_or(&[]); let predicates =
crate_map.predicates.get(&item_def_id.to_def_id()).copied().unwrap_or(&[]);
if tcx.has_attr(item_def_id, sym::rustc_outlives) { if tcx.has_attr(item_def_id, sym::rustc_outlives) {
let mut pred: Vec<String> = predicates let mut pred: Vec<String> = predicates

View file

@ -6,7 +6,7 @@ pub fn test_inferred_outlives(tcx: TyCtxt<'_>) {
for id in tcx.hir().items() { for id in tcx.hir().items() {
// For unit testing: check for a special "rustc_outlives" // For unit testing: check for a special "rustc_outlives"
// attribute and report an error with various results if found. // attribute and report an error with various results if found.
if tcx.has_attr(id.owner_id.to_def_id(), sym::rustc_outlives) { if tcx.has_attr(id.owner_id, sym::rustc_outlives) {
let inferred_outlives_of = tcx.inferred_outlives_of(id.owner_id); let inferred_outlives_of = tcx.inferred_outlives_of(id.owner_id);
struct_span_err!( struct_span_err!(
tcx.sess, tcx.sess,

View file

@ -38,7 +38,7 @@ fn crate_variances(tcx: TyCtxt<'_>, (): ()) -> CrateVariancesMap<'_> {
solve::solve_constraints(constraints_cx) solve::solve_constraints(constraints_cx)
} }
fn variances_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[ty::Variance] { fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
// Skip items with no generics - there's nothing to infer in them. // Skip items with no generics - there's nothing to infer in them.
if tcx.generics_of(item_def_id).count() == 0 { if tcx.generics_of(item_def_id).count() == 0 {
return &[]; return &[];
@ -53,7 +53,7 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[ty::Variance] {
| DefKind::Variant | DefKind::Variant
| DefKind::Ctor(..) => {} | DefKind::Ctor(..) => {}
DefKind::OpaqueTy | DefKind::ImplTraitPlaceholder => { DefKind::OpaqueTy | DefKind::ImplTraitPlaceholder => {
return variance_of_opaque(tcx, item_def_id.expect_local()); return variance_of_opaque(tcx, item_def_id);
} }
_ => { _ => {
// Variance not relevant. // Variance not relevant.
@ -64,7 +64,7 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: DefId) -> &[ty::Variance] {
// Everything else must be inferred. // Everything else must be inferred.
let crate_map = tcx.crate_variances(()); let crate_map = tcx.crate_variances(());
crate_map.variances.get(&item_def_id).copied().unwrap_or(&[]) crate_map.variances.get(&item_def_id.to_def_id()).copied().unwrap_or(&[])
} }
#[instrument(level = "trace", skip(tcx), ret)] #[instrument(level = "trace", skip(tcx), ret)]

View file

@ -7,7 +7,7 @@ pub fn test_variance(tcx: TyCtxt<'_>) {
// For unit testing: check for a special "rustc_variance" // For unit testing: check for a special "rustc_variance"
// attribute and report an error with various results if found. // attribute and report an error with various results if found.
for id in tcx.hir().items() { for id in tcx.hir().items() {
if tcx.has_attr(id.owner_id.to_def_id(), sym::rustc_variance) { if tcx.has_attr(id.owner_id, sym::rustc_variance) {
let variances_of = tcx.variances_of(id.owner_id); let variances_of = tcx.variances_of(id.owner_id);
tcx.sess.emit_err(errors::VariancesOf { tcx.sess.emit_err(errors::VariancesOf {

View file

@ -207,7 +207,7 @@ fn typeck_with_fallback<'tcx>(
let body = tcx.hir().body(body_id); let body = tcx.hir().body(body_id);
let param_env = tcx.param_env(def_id); let param_env = tcx.param_env(def_id);
let param_env = if tcx.has_attr(def_id.to_def_id(), sym::rustc_do_not_const_check) { let param_env = if tcx.has_attr(def_id, sym::rustc_do_not_const_check) {
param_env.without_const() param_env.without_const()
} else { } else {
param_env param_env

View file

@ -1498,7 +1498,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
fn should_log_capture_analysis(&self, closure_def_id: LocalDefId) -> bool { fn should_log_capture_analysis(&self, closure_def_id: LocalDefId) -> bool {
self.tcx.has_attr(closure_def_id.to_def_id(), sym::rustc_capture_analysis) self.tcx.has_attr(closure_def_id, sym::rustc_capture_analysis)
} }
fn log_capture_analysis_first_pass( fn log_capture_analysis_first_pass(

View file

@ -44,8 +44,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// This attribute causes us to dump some writeback information // This attribute causes us to dump some writeback information
// in the form of errors, which is used for unit tests. // in the form of errors, which is used for unit tests.
let rustc_dump_user_substs = let rustc_dump_user_substs = self.tcx.has_attr(item_def_id, sym::rustc_dump_user_substs);
self.tcx.has_attr(item_def_id.to_def_id(), sym::rustc_dump_user_substs);
let mut wbcx = WritebackCx::new(self, body, rustc_dump_user_substs); let mut wbcx = WritebackCx::new(self, body, rustc_dump_user_substs);
for param in body.params { for param in body.params {

View file

@ -371,7 +371,7 @@ impl<'tcx> DirtyCleanVisitor<'tcx> {
fn check_item(&mut self, item_id: LocalDefId) { fn check_item(&mut self, item_id: LocalDefId) {
let item_span = self.tcx.def_span(item_id.to_def_id()); let item_span = self.tcx.def_span(item_id.to_def_id());
let def_path_hash = self.tcx.def_path_hash(item_id.to_def_id()); let def_path_hash = self.tcx.def_path_hash(item_id.to_def_id());
for attr in self.tcx.get_attrs(item_id.to_def_id(), sym::rustc_clean) { for attr in self.tcx.get_attrs(item_id, sym::rustc_clean) {
let Some(assertion) = self.assertion_maybe(item_id, attr) else { let Some(assertion) = self.assertion_maybe(item_id, attr) else {
continue; continue;
}; };

View file

@ -356,7 +356,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
if !self.same_type_modulo_infer(*found_sig, *expected_sig) if !self.same_type_modulo_infer(*found_sig, *expected_sig)
|| !sig.is_suggestable(self.tcx, true) || !sig.is_suggestable(self.tcx, true)
|| ty::util::is_intrinsic(self.tcx, *did) || self.tcx.is_intrinsic(*did)
{ {
return; return;
} }
@ -400,8 +400,8 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
if !self.same_type_modulo_infer(*found_sig, *expected_sig) if !self.same_type_modulo_infer(*found_sig, *expected_sig)
|| !found_sig.is_suggestable(self.tcx, true) || !found_sig.is_suggestable(self.tcx, true)
|| !expected_sig.is_suggestable(self.tcx, true) || !expected_sig.is_suggestable(self.tcx, true)
|| ty::util::is_intrinsic(self.tcx, *did1) || self.tcx.is_intrinsic(*did1)
|| ty::util::is_intrinsic(self.tcx, *did2) || self.tcx.is_intrinsic(*did2)
{ {
return; return;
} }

View file

@ -1306,7 +1306,7 @@ impl<'tcx> LateLintPass<'tcx> for UngatedAsyncFnTrackCaller {
if fn_kind.asyncness() == IsAsync::Async if fn_kind.asyncness() == IsAsync::Async
&& !cx.tcx.features().closure_track_caller && !cx.tcx.features().closure_track_caller
// Now, check if the function has the `#[track_caller]` attribute // Now, check if the function has the `#[track_caller]` attribute
&& let Some(attr) = cx.tcx.get_attr(def_id.to_def_id(), sym::track_caller) && let Some(attr) = cx.tcx.get_attr(def_id, sym::track_caller)
{ {
cx.emit_spanned_lint(UNGATED_ASYNC_FN_TRACK_CALLER, attr.span, BuiltinUngatedAsyncFnTrackCaller { cx.emit_spanned_lint(UNGATED_ASYNC_FN_TRACK_CALLER, attr.span, BuiltinUngatedAsyncFnTrackCaller {
label: span, label: span,
@ -2748,10 +2748,7 @@ impl ClashingExternDeclarations {
// information, we could have codegen_fn_attrs also give span information back for // information, we could have codegen_fn_attrs also give span information back for
// where the attribute was defined. However, until this is found to be a // where the attribute was defined. However, until this is found to be a
// bottleneck, this does just fine. // bottleneck, this does just fine.
( (overridden_link_name, tcx.get_attr(fi.owner_id, sym::link_name).unwrap().span)
overridden_link_name,
tcx.get_attr(fi.owner_id.to_def_id(), sym::link_name).unwrap().span,
)
}) })
{ {
SymbolName::Link(overridden_link_name, overridden_link_name_span) SymbolName::Link(overridden_link_name, overridden_link_name_span)

View file

@ -386,7 +386,7 @@ impl LateLintPass<'_> for Diagnostics {
for (hir_id, parent) in cx.tcx.hir().parent_iter(expr.hir_id) { for (hir_id, parent) in cx.tcx.hir().parent_iter(expr.hir_id) {
if let Some(owner_did) = hir_id.as_owner() { if let Some(owner_did) = hir_id.as_owner() {
found_parent_with_attr = found_parent_with_attr found_parent_with_attr = found_parent_with_attr
|| cx.tcx.has_attr(owner_did.to_def_id(), sym::rustc_lint_diagnostics); || cx.tcx.has_attr(owner_did, sym::rustc_lint_diagnostics);
} }
debug!(?parent); debug!(?parent);

View file

@ -384,9 +384,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase {
match &fk { match &fk {
FnKind::Method(ident, sig, ..) => match method_context(cx, id) { FnKind::Method(ident, sig, ..) => match method_context(cx, id) {
MethodLateContext::PlainImpl => { MethodLateContext::PlainImpl => {
if sig.header.abi != Abi::Rust if sig.header.abi != Abi::Rust && cx.tcx.has_attr(id, sym::no_mangle) {
&& cx.tcx.has_attr(id.to_def_id(), sym::no_mangle)
{
return; return;
} }
self.check_snake_case(cx, "method", ident); self.check_snake_case(cx, "method", ident);
@ -398,7 +396,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase {
}, },
FnKind::ItemFn(ident, _, header) => { FnKind::ItemFn(ident, _, header) => {
// Skip foreign-ABI #[no_mangle] functions (Issue #31924) // Skip foreign-ABI #[no_mangle] functions (Issue #31924)
if header.abi != Abi::Rust && cx.tcx.has_attr(id.to_def_id(), sym::no_mangle) { if header.abi != Abi::Rust && cx.tcx.has_attr(id, sym::no_mangle) {
return; return;
} }
self.check_snake_case(cx, "function", ident); self.check_snake_case(cx, "function", ident);

View file

@ -367,10 +367,7 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
*providers = Providers { *providers = Providers {
allocator_kind: |tcx, ()| CStore::from_tcx(tcx).allocator_kind(), allocator_kind: |tcx, ()| CStore::from_tcx(tcx).allocator_kind(),
alloc_error_handler_kind: |tcx, ()| CStore::from_tcx(tcx).alloc_error_handler_kind(), alloc_error_handler_kind: |tcx, ()| CStore::from_tcx(tcx).alloc_error_handler_kind(),
is_private_dep: |_tcx, cnum| { is_private_dep: |_tcx, ()| false,
assert_eq!(cnum, LOCAL_CRATE);
false
},
native_library: |tcx, id| { native_library: |tcx, id| {
tcx.native_libraries(id.krate) tcx.native_libraries(id.krate)
.iter() .iter()
@ -386,12 +383,8 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
.contains(&id) .contains(&id)
}) })
}, },
native_libraries: |tcx, cnum| { native_libraries: |tcx, ()| native_libs::collect(tcx),
assert_eq!(cnum, LOCAL_CRATE); foreign_modules: |tcx, ()| {
native_libs::collect(tcx)
},
foreign_modules: |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
foreign_modules::collect(tcx).into_iter().map(|m| (m.def_id, m)).collect() foreign_modules::collect(tcx).into_iter().map(|m| (m.def_id, m)).collect()
}, },
@ -489,14 +482,8 @@ pub(in crate::rmeta) fn provide(providers: &mut Providers) {
}, },
dependency_formats: |tcx, ()| Lrc::new(crate::dependency_format::calculate(tcx)), dependency_formats: |tcx, ()| Lrc::new(crate::dependency_format::calculate(tcx)),
has_global_allocator: |tcx, cnum| { has_global_allocator: |tcx, ()| CStore::from_tcx(tcx).has_global_allocator(),
assert_eq!(cnum, LOCAL_CRATE); has_alloc_error_handler: |tcx, ()| CStore::from_tcx(tcx).has_alloc_error_handler(),
CStore::from_tcx(tcx).has_global_allocator()
},
has_alloc_error_handler: |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
CStore::from_tcx(tcx).has_alloc_error_handler()
},
postorder_cnums: |tcx, ()| { postorder_cnums: |tcx, ()| {
tcx.arena tcx.arena
.alloc_slice(&CStore::from_tcx(tcx).crate_dependencies_in_postorder(LOCAL_CRATE)) .alloc_slice(&CStore::from_tcx(tcx).crate_dependencies_in_postorder(LOCAL_CRATE))

View file

@ -2231,18 +2231,16 @@ pub fn provide(providers: &mut Providers) {
doc_link_resolutions: |tcx, def_id| { doc_link_resolutions: |tcx, def_id| {
tcx.resolutions(()) tcx.resolutions(())
.doc_link_resolutions .doc_link_resolutions
.get(&def_id.expect_local()) .get(&def_id)
.expect("no resolutions for a doc link") .expect("no resolutions for a doc link")
}, },
doc_link_traits_in_scope: |tcx, def_id| { doc_link_traits_in_scope: |tcx, def_id| {
tcx.resolutions(()) tcx.resolutions(())
.doc_link_traits_in_scope .doc_link_traits_in_scope
.get(&def_id.expect_local()) .get(&def_id)
.expect("no traits in scope for a doc link") .expect("no traits in scope for a doc link")
}, },
traits_in_crate: |tcx, cnum| { traits_in_crate: |tcx, ()| {
assert_eq!(cnum, LOCAL_CRATE);
let mut traits = Vec::new(); let mut traits = Vec::new();
for id in tcx.hir().items() { for id in tcx.hir().items() {
if matches!(tcx.def_kind(id.owner_id), DefKind::Trait | DefKind::TraitAlias) { if matches!(tcx.def_kind(id.owner_id), DefKind::Trait | DefKind::TraitAlias) {
@ -2254,9 +2252,7 @@ pub fn provide(providers: &mut Providers) {
traits.sort_by_cached_key(|&def_id| tcx.def_path_hash(def_id)); traits.sort_by_cached_key(|&def_id| tcx.def_path_hash(def_id));
tcx.arena.alloc_slice(&traits) tcx.arena.alloc_slice(&traits)
}, },
trait_impls_in_crate: |tcx, cnum| { trait_impls_in_crate: |tcx, ()| {
assert_eq!(cnum, LOCAL_CRATE);
let mut trait_impls = Vec::new(); let mut trait_impls = Vec::new();
for id in tcx.hir().items() { for id in tcx.hir().items() {
if matches!(tcx.def_kind(id.owner_id), DefKind::Impl { .. }) if matches!(tcx.def_kind(id.owner_id), DefKind::Impl { .. })

View file

@ -6,7 +6,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::{par_for_each_in, Send, Sync}; use rustc_data_structures::sync::{par_for_each_in, Send, Sync};
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash}; use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::*; use rustc_hir::*;
@ -1131,8 +1131,7 @@ impl<'hir> intravisit::Map<'hir> for Map<'hir> {
} }
} }
pub(super) fn crate_hash(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Svh { pub(super) fn crate_hash(tcx: TyCtxt<'_>, (): ()) -> Svh {
debug_assert_eq!(crate_num, LOCAL_CRATE);
let krate = tcx.hir_crate(()); let krate = tcx.hir_crate(());
let hir_body_hash = krate.opt_hir_hash.expect("HIR hash missing while computing crate hash"); let hir_body_hash = krate.opt_hir_hash.expect("HIR hash missing while computing crate hash");

View file

@ -147,18 +147,18 @@ pub fn provide(providers: &mut Providers) {
tcx.hir_crate(()).owners[id.def_id].as_owner().map_or(AttributeMap::EMPTY, |o| &o.attrs) tcx.hir_crate(()).owners[id.def_id].as_owner().map_or(AttributeMap::EMPTY, |o| &o.attrs)
}; };
providers.def_span = |tcx, def_id| { providers.def_span = |tcx, def_id| {
let def_id = def_id.expect_local(); let def_id = def_id;
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
tcx.hir().opt_span(hir_id).unwrap_or(DUMMY_SP) tcx.hir().opt_span(hir_id).unwrap_or(DUMMY_SP)
}; };
providers.def_ident_span = |tcx, def_id| { providers.def_ident_span = |tcx, def_id| {
let def_id = def_id.expect_local(); let def_id = def_id;
let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = tcx.hir().local_def_id_to_hir_id(def_id);
tcx.hir().opt_ident_span(hir_id) tcx.hir().opt_ident_span(hir_id)
}; };
providers.fn_arg_names = |tcx, id| { providers.fn_arg_names = |tcx, id| {
let hir = tcx.hir(); let hir = tcx.hir();
let def_id = id.expect_local(); let def_id = id;
let hir_id = hir.local_def_id_to_hir_id(def_id); let hir_id = hir.local_def_id_to_hir_id(def_id);
if let Some(body_id) = hir.maybe_body_owned_by(def_id) { if let Some(body_id) = hir.maybe_body_owned_by(def_id) {
tcx.arena.alloc_from_iter(hir.body_param_names(body_id)) tcx.arena.alloc_from_iter(hir.body_param_names(body_id))
@ -176,12 +176,10 @@ pub fn provide(providers: &mut Providers) {
span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", id); span_bug!(hir.span(hir_id), "fn_arg_names: unexpected item {:?}", id);
} }
}; };
providers.opt_def_kind = |tcx, def_id| tcx.hir().opt_def_kind(def_id.expect_local()); providers.opt_def_kind = |tcx, def_id| tcx.hir().opt_def_kind(def_id);
providers.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls; providers.all_local_trait_impls = |tcx, ()| &tcx.resolutions(()).trait_impls;
providers.expn_that_defined = |tcx, id| { providers.expn_that_defined =
let id = id.expect_local(); |tcx, id| tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root());
tcx.resolutions(()).expn_that_defined.get(&id).copied().unwrap_or(ExpnId::root())
};
providers.in_scope_traits_map = |tcx, id| { providers.in_scope_traits_map = |tcx, id| {
tcx.hir_crate(()).owners[id.def_id].as_owner().map(|owner_info| &owner_info.trait_map) tcx.hir_crate(()).owners[id.def_id].as_owner().map(|owner_info| &owner_info.trait_map)
}; };

View file

@ -26,9 +26,11 @@ pub trait Key: Sized {
// r-a issue: <https://github.com/rust-lang/rust-analyzer/issues/13693> // r-a issue: <https://github.com/rust-lang/rust-analyzer/issues/13693>
type CacheSelector; type CacheSelector;
type LocalKey;
/// Given an instance of this key, what crate is it referring to? /// Given an instance of this key, what crate is it referring to?
/// This is used to find the provider. /// This is used to find the provider.
fn query_crate_is_local(&self) -> bool; fn as_local_key(&self) -> Option<Self::LocalKey>;
/// In the event that a cycle occurs, if no explicit span has been /// In the event that a cycle occurs, if no explicit span has been
/// given for a query with key `self`, what span should we use? /// given for a query with key `self`, what span should we use?
@ -47,10 +49,11 @@ pub trait Key: Sized {
impl Key for () { impl Key for () {
type CacheSelector = SingleCacheSelector; type CacheSelector = SingleCacheSelector;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
@ -60,10 +63,11 @@ impl Key for () {
impl<'tcx> Key for ty::InstanceDef<'tcx> { impl<'tcx> Key for ty::InstanceDef<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
self.def_id().is_local() self.def_id().is_local().then(|| *self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -73,10 +77,11 @@ impl<'tcx> Key for ty::InstanceDef<'tcx> {
impl<'tcx> Key for ty::Instance<'tcx> { impl<'tcx> Key for ty::Instance<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
self.def_id().is_local() self.def_id().is_local().then(|| *self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -86,10 +91,11 @@ impl<'tcx> Key for ty::Instance<'tcx> {
impl<'tcx> Key for mir::interpret::GlobalId<'tcx> { impl<'tcx> Key for mir::interpret::GlobalId<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -99,10 +105,11 @@ impl<'tcx> Key for mir::interpret::GlobalId<'tcx> {
impl<'tcx> Key for (Ty<'tcx>, Option<ty::PolyExistentialTraitRef<'tcx>>) { impl<'tcx> Key for (Ty<'tcx>, Option<ty::PolyExistentialTraitRef<'tcx>>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
@ -112,10 +119,11 @@ impl<'tcx> Key for (Ty<'tcx>, Option<ty::PolyExistentialTraitRef<'tcx>>) {
impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> { impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -125,11 +133,13 @@ impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> {
impl Key for CrateNum { impl Key for CrateNum {
type CacheSelector = VecCacheSelector<Self>; type CacheSelector = VecCacheSelector<Self>;
type LocalKey = ();
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
*self == LOCAL_CRATE (*self == LOCAL_CRATE).then_some(())
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -137,14 +147,17 @@ impl Key for CrateNum {
impl Key for OwnerId { impl Key for OwnerId {
type CacheSelector = VecCacheSelector<Self>; type CacheSelector = VecCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.to_def_id().default_span(tcx) self.to_def_id().default_span(tcx)
} }
fn key_as_def_id(&self) -> Option<DefId> { fn key_as_def_id(&self) -> Option<DefId> {
Some(self.to_def_id()) Some(self.to_def_id())
} }
@ -152,14 +165,17 @@ impl Key for OwnerId {
impl Key for LocalDefId { impl Key for LocalDefId {
type CacheSelector = VecCacheSelector<Self>; type CacheSelector = VecCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.to_def_id().default_span(tcx) self.to_def_id().default_span(tcx)
} }
fn key_as_def_id(&self) -> Option<DefId> { fn key_as_def_id(&self) -> Option<DefId> {
Some(self.to_def_id()) Some(self.to_def_id())
} }
@ -167,14 +183,17 @@ impl Key for LocalDefId {
impl Key for DefId { impl Key for DefId {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = LocalDefId;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.krate == LOCAL_CRATE self.as_local()
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(*self) tcx.def_span(*self)
} }
#[inline(always)] #[inline(always)]
fn key_as_def_id(&self) -> Option<DefId> { fn key_as_def_id(&self) -> Option<DefId> {
Some(*self) Some(*self)
@ -183,11 +202,13 @@ impl Key for DefId {
impl Key for ty::WithOptConstParam<LocalDefId> { impl Key for ty::WithOptConstParam<LocalDefId> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.did.default_span(tcx) self.did.default_span(tcx)
} }
@ -195,11 +216,13 @@ impl Key for ty::WithOptConstParam<LocalDefId> {
impl Key for SimplifiedType { impl Key for SimplifiedType {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -207,11 +230,13 @@ impl Key for SimplifiedType {
impl Key for (DefId, DefId) { impl Key for (DefId, DefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, DefId);
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0.krate == LOCAL_CRATE Some((self.0.as_local()?, self.1))
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
} }
@ -219,11 +244,13 @@ impl Key for (DefId, DefId) {
impl<'tcx> Key for (ty::Instance<'tcx>, LocalDefId) { impl<'tcx> Key for (ty::Instance<'tcx>, LocalDefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -231,11 +258,13 @@ impl<'tcx> Key for (ty::Instance<'tcx>, LocalDefId) {
impl Key for (DefId, LocalDefId) { impl Key for (DefId, LocalDefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, LocalDefId);
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0.krate == LOCAL_CRATE Some((self.0.as_local()?, self.1))
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
} }
@ -243,11 +272,13 @@ impl Key for (DefId, LocalDefId) {
impl Key for (LocalDefId, DefId) { impl Key for (LocalDefId, DefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -255,11 +286,13 @@ impl Key for (LocalDefId, DefId) {
impl Key for (LocalDefId, LocalDefId) { impl Key for (LocalDefId, LocalDefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -267,14 +300,16 @@ impl Key for (LocalDefId, LocalDefId) {
impl Key for (DefId, Option<Ident>) { impl Key for (DefId, Option<Ident>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, Option<Ident>);
#[inline(always)] fn as_local_key(&self) -> Option<Self::LocalKey> {
fn query_crate_is_local(&self) -> bool { Some((self.0.as_local()?, self.1))
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.0) tcx.def_span(self.0)
} }
#[inline(always)] #[inline(always)]
fn key_as_def_id(&self) -> Option<DefId> { fn key_as_def_id(&self) -> Option<DefId> {
Some(self.0) Some(self.0)
@ -283,11 +318,12 @@ impl Key for (DefId, Option<Ident>) {
impl Key for (DefId, LocalDefId, Ident) { impl Key for (DefId, LocalDefId, Ident) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, LocalDefId, Ident);
#[inline(always)] fn as_local_key(&self) -> Option<Self::LocalKey> {
fn query_crate_is_local(&self) -> bool { Some((self.0.as_local()?, self.1, self.2))
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
} }
@ -295,11 +331,13 @@ impl Key for (DefId, LocalDefId, Ident) {
impl Key for (CrateNum, DefId) { impl Key for (CrateNum, DefId) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = DefId;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0 == LOCAL_CRATE (self.0 == LOCAL_CRATE).then_some(self.1)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
} }
@ -307,11 +345,13 @@ impl Key for (CrateNum, DefId) {
impl Key for (CrateNum, SimplifiedType) { impl Key for (CrateNum, SimplifiedType) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = SimplifiedType;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0 == LOCAL_CRATE (self.0 == LOCAL_CRATE).then_some(self.1)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -319,11 +359,13 @@ impl Key for (CrateNum, SimplifiedType) {
impl Key for (DefId, SimplifiedType) { impl Key for (DefId, SimplifiedType) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, SimplifiedType);
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0.krate == LOCAL_CRATE Some((self.0.as_local()?, self.1))
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -331,11 +373,13 @@ impl Key for (DefId, SimplifiedType) {
impl<'tcx> Key for SubstsRef<'tcx> { impl<'tcx> Key for SubstsRef<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -343,11 +387,13 @@ impl<'tcx> Key for SubstsRef<'tcx> {
impl<'tcx> Key for (DefId, SubstsRef<'tcx>) { impl<'tcx> Key for (DefId, SubstsRef<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = (LocalDefId, SubstsRef<'tcx>);
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0.krate == LOCAL_CRATE Some((self.0.as_local()?, self.1))
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -355,11 +401,13 @@ impl<'tcx> Key for (DefId, SubstsRef<'tcx>) {
impl<'tcx> Key for (ty::UnevaluatedConst<'tcx>, ty::UnevaluatedConst<'tcx>) { impl<'tcx> Key for (ty::UnevaluatedConst<'tcx>, ty::UnevaluatedConst<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
(self.0).def.did.krate == LOCAL_CRATE self.0.def.is_local().then_some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
(self.0).def.did.default_span(tcx) (self.0).def.did.default_span(tcx)
} }
@ -367,11 +415,13 @@ impl<'tcx> Key for (ty::UnevaluatedConst<'tcx>, ty::UnevaluatedConst<'tcx>) {
impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) { impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
} }
@ -379,11 +429,13 @@ impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) { impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.1.def_id().krate == LOCAL_CRATE self.1.def_id().is_local().then_some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.1.def_id()) tcx.def_span(self.1.def_id())
} }
@ -391,11 +443,13 @@ impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
impl<'tcx> Key for (ty::Const<'tcx>, mir::Field) { impl<'tcx> Key for (ty::Const<'tcx>, mir::Field) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -403,11 +457,13 @@ impl<'tcx> Key for (ty::Const<'tcx>, mir::Field) {
impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> { impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -415,11 +471,13 @@ impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
impl<'tcx> Key for ty::PolyTraitRef<'tcx> { impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.def_id().krate == LOCAL_CRATE self.def_id().is_local().then_some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.def_id()) tcx.def_span(self.def_id())
} }
@ -427,11 +485,13 @@ impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
impl<'tcx> Key for ty::PolyExistentialTraitRef<'tcx> { impl<'tcx> Key for ty::PolyExistentialTraitRef<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.def_id().krate == LOCAL_CRATE self.def_id().is_local().then_some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.def_id()) tcx.def_span(self.def_id())
} }
@ -439,11 +499,13 @@ impl<'tcx> Key for ty::PolyExistentialTraitRef<'tcx> {
impl<'tcx> Key for (ty::PolyTraitRef<'tcx>, ty::PolyTraitRef<'tcx>) { impl<'tcx> Key for (ty::PolyTraitRef<'tcx>, ty::PolyTraitRef<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self::LocalKey> {
self.0.def_id().krate == LOCAL_CRATE self.0.def_id().is_local().then_some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.0.def_id()) tcx.def_span(self.0.def_id())
} }
@ -451,11 +513,13 @@ impl<'tcx> Key for (ty::PolyTraitRef<'tcx>, ty::PolyTraitRef<'tcx>) {
impl<'tcx> Key for GenericArg<'tcx> { impl<'tcx> Key for GenericArg<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -463,11 +527,13 @@ impl<'tcx> Key for GenericArg<'tcx> {
impl<'tcx> Key for mir::ConstantKind<'tcx> { impl<'tcx> Key for mir::ConstantKind<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -475,11 +541,13 @@ impl<'tcx> Key for mir::ConstantKind<'tcx> {
impl<'tcx> Key for ty::Const<'tcx> { impl<'tcx> Key for ty::Const<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -487,14 +555,17 @@ impl<'tcx> Key for ty::Const<'tcx> {
impl<'tcx> Key for Ty<'tcx> { impl<'tcx> Key for Ty<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
fn ty_adt_id(&self) -> Option<DefId> { fn ty_adt_id(&self) -> Option<DefId> {
match self.kind() { match self.kind() {
ty::Adt(adt, _) => Some(adt.did()), ty::Adt(adt, _) => Some(adt.did()),
@ -505,11 +576,13 @@ impl<'tcx> Key for Ty<'tcx> {
impl<'tcx> Key for TyAndLayout<'tcx> { impl<'tcx> Key for TyAndLayout<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -517,11 +590,13 @@ impl<'tcx> Key for TyAndLayout<'tcx> {
impl<'tcx> Key for (Ty<'tcx>, Ty<'tcx>) { impl<'tcx> Key for (Ty<'tcx>, Ty<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -529,11 +604,13 @@ impl<'tcx> Key for (Ty<'tcx>, Ty<'tcx>) {
impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> { impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -541,11 +618,13 @@ impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> {
impl<'tcx> Key for ty::ParamEnv<'tcx> { impl<'tcx> Key for ty::ParamEnv<'tcx> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -553,11 +632,12 @@ impl<'tcx> Key for ty::ParamEnv<'tcx> {
impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> { impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = ty::ParamEnvAnd<'tcx, T::LocalKey>;
#[inline(always)] fn as_local_key(&self) -> Option<Self::LocalKey> {
fn query_crate_is_local(&self) -> bool { self.value.as_local_key().map(|value| ty::ParamEnvAnd { param_env: self.param_env, value })
self.value.query_crate_is_local()
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.value.default_span(tcx) self.value.default_span(tcx)
} }
@ -565,11 +645,13 @@ impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> {
impl Key for Symbol { impl Key for Symbol {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -577,11 +659,13 @@ impl Key for Symbol {
impl Key for Option<Symbol> { impl Key for Option<Symbol> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
} }
@ -589,12 +673,13 @@ impl Key for Option<Symbol> {
/// Canonical query goals correspond to abstract trait operations that /// Canonical query goals correspond to abstract trait operations that
/// are not tied to any crate in particular. /// are not tied to any crate in particular.
impl<'tcx, T> Key for Canonical<'tcx, T> { impl<'tcx, T: Clone> Key for Canonical<'tcx, T> {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(self.clone())
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -604,10 +689,11 @@ impl<'tcx, T> Key for Canonical<'tcx, T> {
impl Key for (Symbol, u32, u32) { impl Key for (Symbol, u32, u32) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -617,10 +703,11 @@ impl Key for (Symbol, u32, u32) {
impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) { impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -630,10 +717,11 @@ impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) {
impl<'tcx> Key for (ty::Predicate<'tcx>, traits::WellFormedLoc) { impl<'tcx> Key for (ty::Predicate<'tcx>, traits::WellFormedLoc) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -643,10 +731,11 @@ impl<'tcx> Key for (ty::Predicate<'tcx>, traits::WellFormedLoc) {
impl<'tcx> Key for (ty::PolyFnSig<'tcx>, &'tcx ty::List<Ty<'tcx>>) { impl<'tcx> Key for (ty::PolyFnSig<'tcx>, &'tcx ty::List<Ty<'tcx>>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
@ -656,10 +745,11 @@ impl<'tcx> Key for (ty::PolyFnSig<'tcx>, &'tcx ty::List<Ty<'tcx>>) {
impl<'tcx> Key for (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>) { impl<'tcx> Key for (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -669,10 +759,11 @@ impl<'tcx> Key for (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>) {
impl<'tcx> Key for (Ty<'tcx>, ty::ValTree<'tcx>) { impl<'tcx> Key for (Ty<'tcx>, ty::ValTree<'tcx>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
@ -682,10 +773,11 @@ impl<'tcx> Key for (Ty<'tcx>, ty::ValTree<'tcx>) {
impl Key for HirId { impl Key for HirId {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -700,11 +792,12 @@ impl Key for HirId {
impl<'tcx> Key for (ValidityRequirement, ty::ParamEnvAnd<'tcx, Ty<'tcx>>) { impl<'tcx> Key for (ValidityRequirement, ty::ParamEnvAnd<'tcx, Ty<'tcx>>) {
type CacheSelector = DefaultCacheSelector<Self>; type CacheSelector = DefaultCacheSelector<Self>;
type LocalKey = Self;
// Just forward to `Ty<'tcx>` // Just forward to `Ty<'tcx>`
#[inline(always)] #[inline(always)]
fn query_crate_is_local(&self) -> bool { fn as_local_key(&self) -> Option<Self> {
true Some(*self)
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {

View file

@ -4,7 +4,7 @@ use crate::ty::{self, InternalSubsts, ParamEnv, ParamEnvAnd, Ty, TyCtxt};
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::LocalDefId;
use rustc_macros::HashStable; use rustc_macros::HashStable;
use std::fmt; use std::fmt;
@ -265,8 +265,8 @@ impl<'tcx> Const<'tcx> {
} }
} }
pub fn const_param_default(tcx: TyCtxt<'_>, def_id: DefId) -> ty::EarlyBinder<Const<'_>> { pub fn const_param_default(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::EarlyBinder<Const<'_>> {
let default_def_id = match tcx.hir().get_by_def_id(def_id.expect_local()) { let default_def_id = match tcx.hir().get_by_def_id(def_id) {
hir::Node::GenericParam(hir::GenericParam { hir::Node::GenericParam(hir::GenericParam {
kind: hir::GenericParamKind::Const { default: Some(ac), .. }, kind: hir::GenericParamKind::Const { default: Some(ac), .. },
.. ..

View file

@ -2518,16 +2518,11 @@ pub fn provide(providers: &mut ty::query::Providers) {
providers.extern_mod_stmt_cnum = providers.extern_mod_stmt_cnum =
|tcx, id| tcx.resolutions(()).extern_crate_map.get(&id).cloned(); |tcx, id| tcx.resolutions(()).extern_crate_map.get(&id).cloned();
providers.is_panic_runtime = |tcx, cnum| { providers.is_panic_runtime =
assert_eq!(cnum, LOCAL_CRATE); |tcx, ()| tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::panic_runtime);
tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::panic_runtime) providers.is_compiler_builtins =
}; |tcx, ()| tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins);
providers.is_compiler_builtins = |tcx, cnum| { providers.has_panic_handler = |tcx, ()| {
assert_eq!(cnum, LOCAL_CRATE);
tcx.sess.contains_name(tcx.hir().krate_attrs(), sym::compiler_builtins)
};
providers.has_panic_handler = |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
// We want to check if the panic handler was defined in this crate // We want to check if the panic handler was defined in this crate
tcx.lang_items().panic_impl().map_or(false, |did| did.is_local()) tcx.lang_items().panic_impl().map_or(false, |did| did.is_local())
}; };

View file

@ -187,7 +187,11 @@ impl<'tcx> InstanceDef<'tcx> {
} }
#[inline] #[inline]
pub fn get_attrs(&self, tcx: TyCtxt<'tcx>, attr: Symbol) -> ty::Attributes<'tcx> { pub fn get_attrs(
&self,
tcx: TyCtxt<'tcx>,
attr: Symbol,
) -> impl Iterator<Item = &'tcx rustc_ast::Attribute> {
tcx.get_attrs(self.def_id(), attr) tcx.get_attrs(self.def_id(), attr)
} }

View file

@ -2027,7 +2027,6 @@ impl<'tcx> FieldDef {
} }
} }
pub type Attributes<'tcx> = impl Iterator<Item = &'tcx ast::Attribute>;
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
pub enum ImplOverlapKind { pub enum ImplOverlapKind {
/// These impls are always allowed to overlap. /// These impls are always allowed to overlap.
@ -2375,7 +2374,12 @@ impl<'tcx> TyCtxt<'tcx> {
} }
/// Gets all attributes with the given name. /// Gets all attributes with the given name.
pub fn get_attrs(self, did: DefId, attr: Symbol) -> ty::Attributes<'tcx> { pub fn get_attrs(
self,
did: impl Into<DefId>,
attr: Symbol,
) -> impl Iterator<Item = &'tcx ast::Attribute> {
let did: DefId = did.into();
let filter_fn = move |a: &&ast::Attribute| a.has_name(attr); let filter_fn = move |a: &&ast::Attribute| a.has_name(attr);
if let Some(did) = did.as_local() { if let Some(did) = did.as_local() {
self.hir().attrs(self.hir().local_def_id_to_hir_id(did)).iter().filter(filter_fn) self.hir().attrs(self.hir().local_def_id_to_hir_id(did)).iter().filter(filter_fn)
@ -2386,8 +2390,9 @@ impl<'tcx> TyCtxt<'tcx> {
} }
} }
pub fn get_attr(self, did: DefId, attr: Symbol) -> Option<&'tcx ast::Attribute> { pub fn get_attr(self, did: impl Into<DefId>, attr: Symbol) -> Option<&'tcx ast::Attribute> {
if cfg!(debug_assertions) && !rustc_feature::is_valid_for_get_attr(attr) { if cfg!(debug_assertions) && !rustc_feature::is_valid_for_get_attr(attr) {
let did: DefId = did.into();
bug!("get_attr: unexpected called with DefId `{:?}`, attr `{:?}`", did, attr); bug!("get_attr: unexpected called with DefId `{:?}`, attr `{:?}`", did, attr);
} else { } else {
self.get_attrs(did, attr).next() self.get_attrs(did, attr).next()
@ -2395,7 +2400,8 @@ impl<'tcx> TyCtxt<'tcx> {
} }
/// Determines whether an item is annotated with an attribute. /// Determines whether an item is annotated with an attribute.
pub fn has_attr(self, did: DefId, attr: Symbol) -> bool { pub fn has_attr(self, did: impl Into<DefId>, attr: Symbol) -> bool {
let did: DefId = did.into();
if cfg!(debug_assertions) && !did.is_local() && rustc_feature::is_builtin_only_local(attr) { if cfg!(debug_assertions) && !did.is_local() && rustc_feature::is_builtin_only_local(attr) {
bug!("tried to access the `only_local` attribute `{}` from an extern crate", attr); bug!("tried to access the `only_local` attribute `{}` from an extern crate", attr);
} else { } else {

View file

@ -151,6 +151,24 @@ macro_rules! query_if_arena {
}; };
} }
macro_rules! separate_provide_local_decl {
([][$name:ident]) => {
for<'tcx> fn(
TyCtxt<'tcx>,
query_keys::$name<'tcx>,
) -> query_provided::$name<'tcx>
};
([(separate_provide_extern) $($rest:tt)*][$name:ident]) => {
for<'tcx> fn(
TyCtxt<'tcx>,
query_keys_local::$name<'tcx>,
) -> query_provided::$name<'tcx>
};
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
separate_provide_local_decl!([$($modifiers)*][$($args)*])
};
}
macro_rules! separate_provide_extern_decl { macro_rules! separate_provide_extern_decl {
([][$name:ident]) => { ([][$name:ident]) => {
() ()
@ -212,6 +230,12 @@ macro_rules! define_callbacks {
$(pub type $name<'tcx> = $($K)*;)* $(pub type $name<'tcx> = $($K)*;)*
} }
#[allow(nonstandard_style, unused_lifetimes)] #[allow(nonstandard_style, unused_lifetimes)]
pub mod query_keys_local {
use super::*;
$(pub type $name<'tcx> = <$($K)* as Key>::LocalKey;)*
}
#[allow(nonstandard_style, unused_lifetimes)]
pub mod query_values { pub mod query_values {
use super::*; use super::*;
@ -383,10 +407,7 @@ macro_rules! define_callbacks {
} }
pub struct Providers { pub struct Providers {
$(pub $name: for<'tcx> fn( $(pub $name: separate_provide_local_decl!([$($modifiers)*][$name]),)*
TyCtxt<'tcx>,
query_keys::$name<'tcx>,
) -> query_provided::$name<'tcx>,)*
} }
pub struct ExternProviders { pub struct ExternProviders {
@ -405,7 +426,7 @@ macro_rules! define_callbacks {
If that's not the case, {} was likely never assigned to a provider function.\n", If that's not the case, {} was likely never assigned to a provider function.\n",
stringify!($name), stringify!($name),
key, key,
if key.query_crate_is_local() { "local" } else { "external" }, if key.as_local_key().is_some() { "local" } else { "external" },
stringify!($name), stringify!($name),
),)* ),)*
} }

View file

@ -15,7 +15,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_errors::ErrorGuaranteed; use rustc_errors::ErrorGuaranteed;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def::{CtorOf, DefKind, Res}; use rustc_hir::def::{CtorOf, DefKind, Res};
use rustc_hir::def_id::DefId; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_index::bit_set::GrowableBitSet; use rustc_index::bit_set::GrowableBitSet;
use rustc_index::vec::{Idx, IndexVec}; use rustc_index::vec::{Idx, IndexVec};
use rustc_macros::HashStable; use rustc_macros::HashStable;
@ -1439,8 +1439,7 @@ pub fn reveal_opaque_types_in_bounds<'tcx>(
} }
/// Determines whether an item is annotated with `doc(hidden)`. /// Determines whether an item is annotated with `doc(hidden)`.
fn is_doc_hidden(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn is_doc_hidden(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
assert!(def_id.is_local());
tcx.get_attrs(def_id, sym::doc) tcx.get_attrs(def_id, sym::doc)
.filter_map(|attr| attr.meta_item_list()) .filter_map(|attr| attr.meta_item_list())
.any(|items| items.iter().any(|item| item.has_name(sym::hidden))) .any(|items| items.iter().any(|item| item.has_name(sym::hidden)))
@ -1454,7 +1453,7 @@ pub fn is_doc_notable_trait(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
} }
/// Determines whether an item is an intrinsic by Abi. /// Determines whether an item is an intrinsic by Abi.
pub fn is_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> bool { pub fn is_intrinsic(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
matches!(tcx.fn_sig(def_id).skip_binder().abi(), Abi::RustIntrinsic | Abi::PlatformIntrinsic) matches!(tcx.fn_sig(def_id).skip_binder().abi(), Abi::RustIntrinsic | Abi::PlatformIntrinsic)
} }

View file

@ -5,7 +5,7 @@
//! purposes on a best-effort basis. We compute them here and store them into the crate metadata so //! purposes on a best-effort basis. We compute them here and store them into the crate metadata so
//! dependent crates can use them. //! dependent crates can use them.
use rustc_hir::def_id::DefId; use rustc_hir::def_id::LocalDefId;
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_middle::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor}; use rustc_middle::mir::visit::{NonMutatingUseContext, PlaceContext, Visitor};
use rustc_middle::mir::{Body, Local, Location, Operand, Terminator, TerminatorKind, RETURN_PLACE}; use rustc_middle::mir::{Body, Local, Location, Operand, Terminator, TerminatorKind, RETURN_PLACE};
@ -149,7 +149,10 @@ fn type_will_always_be_passed_directly(ty: Ty<'_>) -> bool {
/// body of the function instead of just the signature. These can be useful for optimization /// body of the function instead of just the signature. These can be useful for optimization
/// purposes on a best-effort basis. We compute them here and store them into the crate metadata so /// purposes on a best-effort basis. We compute them here and store them into the crate metadata so
/// dependent crates can use them. /// dependent crates can use them.
pub fn deduced_param_attrs<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx [DeducedParamAttrs] { pub fn deduced_param_attrs<'tcx>(
tcx: TyCtxt<'tcx>,
def_id: LocalDefId,
) -> &'tcx [DeducedParamAttrs] {
// This computation is unfortunately rather expensive, so don't do it unless we're optimizing. // This computation is unfortunately rather expensive, so don't do it unless we're optimizing.
// Also skip it in incremental mode. // Also skip it in incremental mode.
if tcx.sess.opts.optimize == OptLevel::No || tcx.sess.opts.incremental.is_some() { if tcx.sess.opts.optimize == OptLevel::No || tcx.sess.opts.incremental.is_some() {
@ -182,10 +185,6 @@ pub fn deduced_param_attrs<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx [Ded
return &[]; return &[];
} }
// Deduced attributes for other crates should be read from the metadata instead of via this
// function.
debug_assert!(def_id.is_local());
// Grab the optimized MIR. Analyze it to determine which arguments have been mutated. // Grab the optimized MIR. Analyze it to determine which arguments have been mutated.
let body: &Body<'tcx> = tcx.optimized_mir(def_id); let body: &Body<'tcx> = tcx.optimized_mir(def_id);
let mut deduce_read_only = DeduceReadOnly::new(body.arg_count); let mut deduce_read_only = DeduceReadOnly::new(body.arg_count);

View file

@ -1,4 +1,4 @@
use rustc_hir::def_id::{CrateNum, LocalDefId, LOCAL_CRATE}; use rustc_hir::def_id::{LocalDefId, LOCAL_CRATE};
use rustc_middle::mir::*; use rustc_middle::mir::*;
use rustc_middle::ty::layout; use rustc_middle::ty::layout;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
@ -121,9 +121,7 @@ fn has_ffi_unwind_calls(tcx: TyCtxt<'_>, local_def_id: LocalDefId) -> bool {
tainted tainted
} }
fn required_panic_strategy(tcx: TyCtxt<'_>, cnum: CrateNum) -> Option<PanicStrategy> { fn required_panic_strategy(tcx: TyCtxt<'_>, (): ()) -> Option<PanicStrategy> {
assert_eq!(cnum, LOCAL_CRATE);
if tcx.is_panic_runtime(LOCAL_CRATE) { if tcx.is_panic_runtime(LOCAL_CRATE) {
return Some(tcx.sess.panic_strategy()); return Some(tcx.sess.panic_strategy());
} }

View file

@ -70,7 +70,7 @@ use rustc_mir_dataflow::impls::{
}; };
use rustc_mir_dataflow::storage::always_storage_live_locals; use rustc_mir_dataflow::storage::always_storage_live_locals;
use rustc_mir_dataflow::{self, Analysis}; use rustc_mir_dataflow::{self, Analysis};
use rustc_span::def_id::DefId; use rustc_span::def_id::{DefId, LocalDefId};
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Span; use rustc_span::Span;
use rustc_target::abi::VariantIdx; use rustc_target::abi::VariantIdx;
@ -1386,10 +1386,9 @@ fn create_cases<'tcx>(
#[instrument(level = "debug", skip(tcx), ret)] #[instrument(level = "debug", skip(tcx), ret)]
pub(crate) fn mir_generator_witnesses<'tcx>( pub(crate) fn mir_generator_witnesses<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
def_id: DefId, def_id: LocalDefId,
) -> GeneratorLayout<'tcx> { ) -> GeneratorLayout<'tcx> {
assert!(tcx.sess.opts.unstable_opts.drop_tracking_mir); assert!(tcx.sess.opts.unstable_opts.drop_tracking_mir);
let def_id = def_id.expect_local();
let (body, _) = tcx.mir_promoted(ty::WithOptConstParam::unknown(def_id)); let (body, _) = tcx.mir_promoted(ty::WithOptConstParam::unknown(def_id));
let body = body.borrow(); let body = body.borrow();

View file

@ -112,7 +112,6 @@ pub fn provide(providers: &mut Providers) {
mir_keys, mir_keys,
mir_const, mir_const,
mir_const_qualif: |tcx, def_id| { mir_const_qualif: |tcx, def_id| {
let def_id = def_id.expect_local();
if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) { if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) {
tcx.mir_const_qualif_const_arg(def) tcx.mir_const_qualif_const_arg(def)
} else { } else {
@ -133,7 +132,6 @@ pub fn provide(providers: &mut Providers) {
mir_callgraph_reachable: inline::cycle::mir_callgraph_reachable, mir_callgraph_reachable: inline::cycle::mir_callgraph_reachable,
mir_inliner_callees: inline::cycle::mir_inliner_callees, mir_inliner_callees: inline::cycle::mir_inliner_callees,
promoted_mir: |tcx, def_id| { promoted_mir: |tcx, def_id| {
let def_id = def_id.expect_local();
if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) { if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) {
tcx.promoted_mir_of_const_arg(def) tcx.promoted_mir_of_const_arg(def)
} else { } else {
@ -206,8 +204,7 @@ fn remap_mir_for_const_eval_select<'tcx>(
body body
} }
fn is_mir_available(tcx: TyCtxt<'_>, def_id: DefId) -> bool { fn is_mir_available(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
let def_id = def_id.expect_local();
tcx.mir_keys(()).contains(&def_id) tcx.mir_keys(()).contains(&def_id)
} }
@ -350,12 +347,11 @@ fn mir_promoted(
} }
/// Compute the MIR that is used during CTFE (and thus has no optimizations run on it) /// Compute the MIR that is used during CTFE (and thus has no optimizations run on it)
fn mir_for_ctfe(tcx: TyCtxt<'_>, def_id: DefId) -> &Body<'_> { fn mir_for_ctfe(tcx: TyCtxt<'_>, def_id: LocalDefId) -> &Body<'_> {
let did = def_id.expect_local(); if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) {
if let Some(def) = ty::WithOptConstParam::try_lookup(did, tcx) {
tcx.mir_for_ctfe_of_const_arg(def) tcx.mir_for_ctfe_of_const_arg(def)
} else { } else {
tcx.arena.alloc(inner_mir_for_ctfe(tcx, ty::WithOptConstParam::unknown(did))) tcx.arena.alloc(inner_mir_for_ctfe(tcx, ty::WithOptConstParam::unknown(def_id)))
} }
} }
@ -599,8 +595,7 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
} }
/// Optimize the MIR and prepare it for codegen. /// Optimize the MIR and prepare it for codegen.
fn optimized_mir(tcx: TyCtxt<'_>, did: DefId) -> &Body<'_> { fn optimized_mir(tcx: TyCtxt<'_>, did: LocalDefId) -> &Body<'_> {
let did = did.expect_local();
assert_eq!(ty::WithOptConstParam::try_lookup(did, tcx), None); assert_eq!(ty::WithOptConstParam::try_lookup(did, tcx), None);
tcx.arena.alloc(inner_optimized_mir(tcx, did)) tcx.arena.alloc(inner_optimized_mir(tcx, did))
} }

View file

@ -104,9 +104,7 @@ impl<'tcx> CheckConstVisitor<'tcx> {
// If this crate is not using stability attributes, or this function is not claiming to be a // If this crate is not using stability attributes, or this function is not claiming to be a
// stable `const fn`, that is all that is required. // stable `const fn`, that is all that is required.
if !tcx.features().staged_api if !tcx.features().staged_api || tcx.has_attr(def_id, sym::rustc_const_unstable) {
|| tcx.has_attr(def_id.to_def_id(), sym::rustc_const_unstable)
{
return true; return true;
} }

View file

@ -469,9 +469,9 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
fn has_allow_dead_code_or_lang_attr(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { fn has_allow_dead_code_or_lang_attr(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
fn has_lang_attr(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { fn has_lang_attr(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
tcx.has_attr(def_id.to_def_id(), sym::lang) tcx.has_attr(def_id, sym::lang)
// Stable attribute for #[lang = "panic_impl"] // Stable attribute for #[lang = "panic_impl"]
|| tcx.has_attr(def_id.to_def_id(), sym::panic_handler) || tcx.has_attr(def_id, sym::panic_handler)
} }
fn has_allow_dead_code(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { fn has_allow_dead_code(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {

View file

@ -4,11 +4,9 @@ use hir::CRATE_HIR_ID;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_expand::base::resolve_path; use rustc_expand::base::resolve_path;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::CrateNum;
use rustc_hir::HirId; use rustc_hir::HirId;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::def_id::LOCAL_CRATE;
use rustc_span::{sym, DebuggerVisualizerFile, DebuggerVisualizerType}; use rustc_span::{sym, DebuggerVisualizerFile, DebuggerVisualizerType};
use std::sync::Arc; use std::sync::Arc;
@ -69,9 +67,7 @@ fn check_for_debugger_visualizer(
} }
/// Traverses and collects the debugger visualizers for a specific crate. /// Traverses and collects the debugger visualizers for a specific crate.
fn debugger_visualizers(tcx: TyCtxt<'_>, cnum: CrateNum) -> Vec<DebuggerVisualizerFile> { fn debugger_visualizers(tcx: TyCtxt<'_>, (): ()) -> Vec<DebuggerVisualizerFile> {
assert_eq!(cnum, LOCAL_CRATE);
// Initialize the collector. // Initialize the collector.
let mut debugger_visualizers = FxHashSet::default(); let mut debugger_visualizers = FxHashSet::default();

View file

@ -14,7 +14,7 @@ use rustc_hir::diagnostic_items::DiagnosticItems;
use rustc_hir::OwnerId; use rustc_hir::OwnerId;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE}; use rustc_span::def_id::{DefId, LOCAL_CRATE};
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
use crate::errors::DuplicateDiagnosticItemInCrate; use crate::errors::DuplicateDiagnosticItemInCrate;
@ -62,9 +62,7 @@ fn extract(attrs: &[ast::Attribute]) -> Option<Symbol> {
} }
/// Traverse and collect the diagnostic items in the current /// Traverse and collect the diagnostic items in the current
fn diagnostic_items(tcx: TyCtxt<'_>, cnum: CrateNum) -> DiagnosticItems { fn diagnostic_items(tcx: TyCtxt<'_>, (): ()) -> DiagnosticItems {
assert_eq!(cnum, LOCAL_CRATE);
// Initialize the collector. // Initialize the collector.
let mut diagnostic_items = DiagnosticItems::default(); let mut diagnostic_items = DiagnosticItems::default();

View file

@ -18,7 +18,7 @@ pub fn test_layout(tcx: TyCtxt<'_>) {
tcx.def_kind(id.owner_id), tcx.def_kind(id.owner_id),
DefKind::TyAlias | DefKind::Enum | DefKind::Struct | DefKind::Union DefKind::TyAlias | DefKind::Enum | DefKind::Struct | DefKind::Union
) { ) {
for attr in tcx.get_attrs(id.owner_id.to_def_id(), sym::rustc_layout) { for attr in tcx.get_attrs(id.owner_id, sym::rustc_layout) {
dump_layout_of(tcx, id.owner_id.def_id, attr); dump_layout_of(tcx, id.owner_id.def_id, attr);
} }
} }

View file

@ -146,7 +146,7 @@ fn check_liveness(tcx: TyCtxt<'_>, def_id: DefId) {
// Don't run unused pass for #[derive()] // Don't run unused pass for #[derive()]
let parent = tcx.local_parent(local_def_id); let parent = tcx.local_parent(local_def_id);
if let DefKind::Impl { .. } = tcx.def_kind(parent) if let DefKind::Impl { .. } = tcx.def_kind(parent)
&& tcx.has_attr(parent.to_def_id(), sym::automatically_derived) && tcx.has_attr(parent, sym::automatically_derived)
{ {
return; return;
} }

View file

@ -30,7 +30,7 @@ fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
continue; continue;
} }
let naked = tcx.has_attr(def_id.to_def_id(), sym::naked); let naked = tcx.has_attr(def_id, sym::naked);
if !naked { if !naked {
continue; continue;
} }
@ -59,7 +59,7 @@ fn check_mod_naked_functions(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
/// Check that the function isn't inlined. /// Check that the function isn't inlined.
fn check_inline(tcx: TyCtxt<'_>, def_id: LocalDefId) { fn check_inline(tcx: TyCtxt<'_>, def_id: LocalDefId) {
let attrs = tcx.get_attrs(def_id.to_def_id(), sym::inline); let attrs = tcx.get_attrs(def_id, sym::inline);
for attr in attrs { for attr in attrs {
tcx.sess.emit_err(CannotInlineNakedFunction { span: attr.span }); tcx.sess.emit_err(CannotInlineNakedFunction { span: attr.span });
} }

View file

@ -691,14 +691,10 @@ pub(crate) fn provide(providers: &mut Providers) {
check_mod_unstable_api_usage, check_mod_unstable_api_usage,
stability_index, stability_index,
stability_implications: |tcx, _| tcx.stability().implications.clone(), stability_implications: |tcx, _| tcx.stability().implications.clone(),
lookup_stability: |tcx, id| tcx.stability().local_stability(id.expect_local()), lookup_stability: |tcx, id| tcx.stability().local_stability(id),
lookup_const_stability: |tcx, id| tcx.stability().local_const_stability(id.expect_local()), lookup_const_stability: |tcx, id| tcx.stability().local_const_stability(id),
lookup_default_body_stability: |tcx, id| { lookup_default_body_stability: |tcx, id| tcx.stability().local_default_body_stability(id),
tcx.stability().local_default_body_stability(id.expect_local()) lookup_deprecation_entry: |tcx, id| tcx.stability().local_deprecation_entry(id),
},
lookup_deprecation_entry: |tcx, id| {
tcx.stability().local_deprecation_entry(id.expect_local())
},
..*providers ..*providers
}; };
} }

View file

@ -920,7 +920,7 @@ pub struct TestReachabilityVisitor<'tcx, 'a> {
impl<'tcx, 'a> TestReachabilityVisitor<'tcx, 'a> { impl<'tcx, 'a> TestReachabilityVisitor<'tcx, 'a> {
fn effective_visibility_diagnostic(&mut self, def_id: LocalDefId) { fn effective_visibility_diagnostic(&mut self, def_id: LocalDefId) {
if self.tcx.has_attr(def_id.to_def_id(), sym::rustc_effective_visibility) { if self.tcx.has_attr(def_id, sym::rustc_effective_visibility) {
let mut error_msg = String::new(); let mut error_msg = String::new();
let span = self.tcx.def_span(def_id.to_def_id()); let span = self.tcx.def_span(def_id.to_def_id());
if let Some(effective_vis) = self.effective_visibilities.effective_vis(def_id) { if let Some(effective_vis) = self.effective_visibilities.effective_vis(def_id) {
@ -2060,8 +2060,8 @@ pub fn provide(providers: &mut Providers) {
}; };
} }
fn visibility(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Visibility<DefId> { fn visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility<DefId> {
local_visibility(tcx, def_id.expect_local()).to_def_id() local_visibility(tcx, def_id).to_def_id()
} }
fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility { fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {

View file

@ -274,19 +274,19 @@ macro_rules! hash_result {
}; };
} }
macro_rules! get_provider { macro_rules! call_provider {
([][$tcx:expr, $name:ident, $key:expr]) => {{ ([][$qcx:expr, $name:ident, $key:expr]) => {{
$tcx.queries.local_providers.$name ($qcx.queries.local_providers.$name)($qcx.tcx, $key)
}}; }};
([(separate_provide_extern) $($rest:tt)*][$tcx:expr, $name:ident, $key:expr]) => {{ ([(separate_provide_extern) $($rest:tt)*][$qcx:expr, $name:ident, $key:expr]) => {{
if $key.query_crate_is_local() { if let Some(key) = $key.as_local_key() {
$tcx.queries.local_providers.$name ($qcx.queries.local_providers.$name)($qcx.tcx, key)
} else { } else {
$tcx.queries.extern_providers.$name ($qcx.queries.extern_providers.$name)($qcx.tcx, $key)
} }
}}; }};
([$other:tt $($modifiers:tt)*][$($args:tt)*]) => { ([$other:tt $($modifiers:tt)*][$($args:tt)*]) => {
get_provider!([$($modifiers)*][$($args)*]) call_provider!([$($modifiers)*][$($args)*])
}; };
} }
@ -516,7 +516,7 @@ macro_rules! define_queries {
fn compute(self, qcx: QueryCtxt<'tcx>, key: Self::Key) -> Self::Value { fn compute(self, qcx: QueryCtxt<'tcx>, key: Self::Key) -> Self::Value {
query_provided_to_value::$name( query_provided_to_value::$name(
qcx.tcx, qcx.tcx,
get_provider!([$($modifiers)*][qcx, $name, key])(qcx.tcx, key) call_provider!([$($modifiers)*][qcx, $name, key])
) )
} }

View file

@ -53,7 +53,7 @@ impl SymbolNamesTest<'_> {
// The formatting of `tag({})` is chosen so that tests can elect // The formatting of `tag({})` is chosen so that tests can elect
// to test the entirety of the string, if they choose, or else just // to test the entirety of the string, if they choose, or else just
// some subset. // some subset.
for attr in tcx.get_attrs(def_id.to_def_id(), SYMBOL_NAME) { for attr in tcx.get_attrs(def_id, SYMBOL_NAME) {
let def_id = def_id.to_def_id(); let def_id = def_id.to_def_id();
let instance = Instance::new( let instance = Instance::new(
def_id, def_id,
@ -79,7 +79,7 @@ impl SymbolNamesTest<'_> {
} }
} }
for attr in tcx.get_attrs(def_id.to_def_id(), DEF_PATH) { for attr in tcx.get_attrs(def_id, DEF_PATH) {
tcx.sess.emit_err(TestOutput { tcx.sess.emit_err(TestOutput {
span: attr.span, span: attr.span,
kind: Kind::DefPath, kind: Kind::DefPath,

View file

@ -18,8 +18,8 @@ pub fn provide(providers: &mut ty::query::Providers) {
}; };
} }
fn associated_item_def_ids(tcx: TyCtxt<'_>, def_id: DefId) -> &[DefId] { fn associated_item_def_ids(tcx: TyCtxt<'_>, def_id: LocalDefId) -> &[DefId] {
let item = tcx.hir().expect_item(def_id.expect_local()); let item = tcx.hir().expect_item(def_id);
match item.kind { match item.kind {
hir::ItemKind::Trait(.., ref trait_item_refs) => { hir::ItemKind::Trait(.., ref trait_item_refs) => {
if tcx.lower_impl_trait_in_trait_to_assoc_ty() { if tcx.lower_impl_trait_in_trait_to_assoc_ty() {
@ -107,27 +107,26 @@ fn impl_item_implementor_ids(tcx: TyCtxt<'_>, impl_id: DefId) -> DefIdMap<DefId>
.collect() .collect()
} }
fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AssocItem { fn associated_item(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::AssocItem {
let id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let id = tcx.hir().local_def_id_to_hir_id(def_id);
let parent_def_id = tcx.hir().get_parent_item(id); let parent_def_id = tcx.hir().get_parent_item(id);
let parent_item = tcx.hir().expect_item(parent_def_id.def_id); let parent_item = tcx.hir().expect_item(parent_def_id.def_id);
match parent_item.kind { match parent_item.kind {
hir::ItemKind::Impl(ref impl_) => { hir::ItemKind::Impl(ref impl_) => {
if let Some(impl_item_ref) = if let Some(impl_item_ref) = impl_.items.iter().find(|i| i.id.owner_id.def_id == def_id)
impl_.items.iter().find(|i| i.id.owner_id.to_def_id() == def_id)
{ {
let assoc_item = associated_item_from_impl_item_ref(impl_item_ref); let assoc_item = associated_item_from_impl_item_ref(impl_item_ref);
debug_assert_eq!(assoc_item.def_id, def_id); debug_assert_eq!(assoc_item.def_id.expect_local(), def_id);
return assoc_item; return assoc_item;
} }
} }
hir::ItemKind::Trait(.., ref trait_item_refs) => { hir::ItemKind::Trait(.., ref trait_item_refs) => {
if let Some(trait_item_ref) = if let Some(trait_item_ref) =
trait_item_refs.iter().find(|i| i.id.owner_id.to_def_id() == def_id) trait_item_refs.iter().find(|i| i.id.owner_id.def_id == def_id)
{ {
let assoc_item = associated_item_from_trait_item_ref(trait_item_ref); let assoc_item = associated_item_from_trait_item_ref(trait_item_ref);
debug_assert_eq!(assoc_item.def_id, def_id); debug_assert_eq!(assoc_item.def_id.expect_local(), def_id);
return assoc_item; return assoc_item;
} }
} }
@ -191,9 +190,9 @@ fn associated_item_from_impl_item_ref(impl_item_ref: &hir::ImplItemRef) -> ty::A
/// above, synthesize a corresponding associated type in the impl. /// above, synthesize a corresponding associated type in the impl.
fn associated_types_for_impl_traits_in_associated_fn( fn associated_types_for_impl_traits_in_associated_fn(
tcx: TyCtxt<'_>, tcx: TyCtxt<'_>,
fn_def_id: DefId, fn_def_id: LocalDefId,
) -> &'_ [DefId] { ) -> &'_ [DefId] {
let parent_def_id = tcx.parent(fn_def_id); let parent_def_id = tcx.local_parent(fn_def_id);
match tcx.def_kind(parent_def_id) { match tcx.def_kind(parent_def_id) {
DefKind::Trait => { DefKind::Trait => {
@ -212,7 +211,7 @@ fn associated_types_for_impl_traits_in_associated_fn(
let mut visitor = RPITVisitor { rpits: Vec::new() }; let mut visitor = RPITVisitor { rpits: Vec::new() };
if let Some(output) = tcx.hir().get_fn_output(fn_def_id.expect_local()) { if let Some(output) = tcx.hir().get_fn_output(fn_def_id) {
visitor.visit_fn_ret_ty(output); visitor.visit_fn_ret_ty(output);
tcx.arena.alloc_from_iter(visitor.rpits.iter().map(|opaque_ty_def_id| { tcx.arena.alloc_from_iter(visitor.rpits.iter().map(|opaque_ty_def_id| {
@ -232,7 +231,7 @@ fn associated_types_for_impl_traits_in_associated_fn(
associated_type_for_impl_trait_in_impl( associated_type_for_impl_trait_in_impl(
tcx, tcx,
trait_assoc_def_id.expect_local(), trait_assoc_def_id.expect_local(),
fn_def_id.expect_local(), fn_def_id,
) )
.to_def_id() .to_def_id()
}, },

View file

@ -425,7 +425,6 @@ pub fn provide(providers: &mut ty::query::Providers) {
*providers = ty::query::Providers { *providers = ty::query::Providers {
destructure_const, destructure_const,
thir_abstract_const: |tcx, def_id| { thir_abstract_const: |tcx, def_id| {
let def_id = def_id.expect_local();
if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) { if let Some(def) = ty::WithOptConstParam::try_lookup(def_id, tcx) {
tcx.thir_abstract_const_of_const_arg(def) tcx.thir_abstract_const_of_const_arg(def)
} else { } else {

View file

@ -4,7 +4,7 @@ use rustc_hir::def::DefKind;
use rustc_index::bit_set::BitSet; use rustc_index::bit_set::BitSet;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::{self, Representability, Ty, TyCtxt}; use rustc_middle::ty::{self, Representability, Ty, TyCtxt};
use rustc_span::def_id::{DefId, LocalDefId}; use rustc_span::def_id::LocalDefId;
pub fn provide(providers: &mut Providers) { pub fn provide(providers: &mut Providers) {
*providers = *providers =
@ -85,7 +85,7 @@ fn representability_adt_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Representab
Representability::Representable Representability::Representable
} }
fn params_in_repr(tcx: TyCtxt<'_>, def_id: DefId) -> BitSet<u32> { fn params_in_repr(tcx: TyCtxt<'_>, def_id: LocalDefId) -> BitSet<u32> {
let adt_def = tcx.adt_def(def_id); let adt_def = tcx.adt_def(def_id);
let generics = tcx.generics_of(def_id); let generics = tcx.generics_of(def_id);
let mut params_in_repr = BitSet::new_empty(generics.params.len()); let mut params_in_repr = BitSet::new_empty(generics.params.len());

View file

@ -7,10 +7,8 @@ use rustc_middle::ty::{
TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitor,
}; };
use rustc_session::config::TraitSolver; use rustc_session::config::TraitSolver;
use rustc_span::{ use rustc_span::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
def_id::{DefId, CRATE_DEF_ID}, use rustc_span::DUMMY_SP;
DUMMY_SP,
};
use rustc_trait_selection::traits; use rustc_trait_selection::traits;
fn sized_constraint_for_ty<'tcx>( fn sized_constraint_for_ty<'tcx>(
@ -79,8 +77,8 @@ fn sized_constraint_for_ty<'tcx>(
result result
} }
fn impl_defaultness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Defaultness { fn impl_defaultness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Defaultness {
match tcx.hir().get_by_def_id(def_id.expect_local()) { match tcx.hir().get_by_def_id(def_id) {
hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(impl_), .. }) => impl_.defaultness, hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(impl_), .. }) => impl_.defaultness,
hir::Node::ImplItem(hir::ImplItem { defaultness, .. }) hir::Node::ImplItem(hir::ImplItem { defaultness, .. })
| hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness, | hir::Node::TraitItem(hir::TraitItem { defaultness, .. }) => *defaultness,
@ -516,8 +514,8 @@ fn issue33140_self_ty(tcx: TyCtxt<'_>, def_id: DefId) -> Option<EarlyBinder<Ty<'
} }
/// Check if a function is async. /// Check if a function is async.
fn asyncness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::IsAsync { fn asyncness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::IsAsync {
let node = tcx.hir().get_by_def_id(def_id.expect_local()); let node = tcx.hir().get_by_def_id(def_id);
node.fn_sig().map_or(hir::IsAsync::NotAsync, |sig| sig.header.asyncness) node.fn_sig().map_or(hir::IsAsync::NotAsync, |sig| sig.header.asyncness)
} }

View file

@ -143,7 +143,7 @@ impl<'tcx> LateLintPass<'tcx> for CognitiveComplexity {
span: Span, span: Span,
def_id: LocalDefId, def_id: LocalDefId,
) { ) {
if !cx.tcx.has_attr(def_id.to_def_id(), sym::test) { if !cx.tcx.has_attr(def_id, sym::test) {
let expr = if is_async_fn(kind) { let expr = if is_async_fn(kind) {
match get_async_fn_body(cx.tcx, body) { match get_async_fn_body(cx.tcx, body) {
Some(b) => b, Some(b) => b,

View file

@ -181,7 +181,7 @@ impl<'tcx> LateLintPass<'tcx> for DerivableImpls {
self_ty, self_ty,
.. ..
}) = item.kind; }) = item.kind;
if !cx.tcx.has_attr(item.owner_id.to_def_id(), sym::automatically_derived); if !cx.tcx.has_attr(item.owner_id, sym::automatically_derived);
if !item.span.from_expansion(); if !item.span.from_expansion();
if let Some(def_id) = trait_ref.trait_def_id(); if let Some(def_id) = trait_ref.trait_def_id();
if cx.tcx.is_diagnostic_item(sym::Default, def_id); if cx.tcx.is_diagnostic_item(sym::Default, def_id);

View file

@ -212,7 +212,7 @@ impl<'tcx> LateLintPass<'tcx> for Derive {
}) = item.kind }) = item.kind
{ {
let ty = cx.tcx.type_of(item.owner_id).subst_identity(); let ty = cx.tcx.type_of(item.owner_id).subst_identity();
let is_automatically_derived = cx.tcx.has_attr(item.owner_id.to_def_id(), sym::automatically_derived); let is_automatically_derived = cx.tcx.has_attr(item.owner_id, sym::automatically_derived);
check_hash_peq(cx, item.span, trait_ref, ty, is_automatically_derived); check_hash_peq(cx, item.span, trait_ref, ty, is_automatically_derived);
check_ord_partial_ord(cx, item.span, trait_ref, ty, is_automatically_derived); check_ord_partial_ord(cx, item.span, trait_ref, ty, is_automatically_derived);

View file

@ -22,7 +22,7 @@ use super::{DOUBLE_MUST_USE, MUST_USE_CANDIDATE, MUST_USE_UNIT};
pub(super) fn check_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) { pub(super) fn check_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
let attrs = cx.tcx.hir().attrs(item.hir_id()); let attrs = cx.tcx.hir().attrs(item.hir_id());
let attr = cx.tcx.get_attr(item.owner_id.to_def_id(), sym::must_use); let attr = cx.tcx.get_attr(item.owner_id, sym::must_use);
if let hir::ItemKind::Fn(ref sig, _generics, ref body_id) = item.kind { if let hir::ItemKind::Fn(ref sig, _generics, ref body_id) = item.kind {
let is_public = cx.effective_visibilities.is_exported(item.owner_id.def_id); let is_public = cx.effective_visibilities.is_exported(item.owner_id.def_id);
let fn_header_span = item.span.with_hi(sig.decl.output.span().hi()); let fn_header_span = item.span.with_hi(sig.decl.output.span().hi());
@ -47,7 +47,7 @@ pub(super) fn check_impl_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Imp
let is_public = cx.effective_visibilities.is_exported(item.owner_id.def_id); let is_public = cx.effective_visibilities.is_exported(item.owner_id.def_id);
let fn_header_span = item.span.with_hi(sig.decl.output.span().hi()); let fn_header_span = item.span.with_hi(sig.decl.output.span().hi());
let attrs = cx.tcx.hir().attrs(item.hir_id()); let attrs = cx.tcx.hir().attrs(item.hir_id());
let attr = cx.tcx.get_attr(item.owner_id.to_def_id(), sym::must_use); let attr = cx.tcx.get_attr(item.owner_id, sym::must_use);
if let Some(attr) = attr { if let Some(attr) = attr {
check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr); check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr);
} else if is_public } else if is_public
@ -73,7 +73,7 @@ pub(super) fn check_trait_item<'tcx>(cx: &LateContext<'tcx>, item: &'tcx hir::Tr
let fn_header_span = item.span.with_hi(sig.decl.output.span().hi()); let fn_header_span = item.span.with_hi(sig.decl.output.span().hi());
let attrs = cx.tcx.hir().attrs(item.hir_id()); let attrs = cx.tcx.hir().attrs(item.hir_id());
let attr = cx.tcx.get_attr(item.owner_id.to_def_id(), sym::must_use); let attr = cx.tcx.get_attr(item.owner_id, sym::must_use);
if let Some(attr) = attr { if let Some(attr) = attr {
check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr); check_needless_must_use(cx, sig.decl, item.owner_id, item.span, fn_header_span, attr);
} else if let hir::TraitFn::Provided(eid) = *eid { } else if let hir::TraitFn::Provided(eid) = *eid {

View file

@ -36,7 +36,7 @@ impl<'tcx> LateLintPass<'tcx> for PartialEqNeImpl {
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) { fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) {
if_chain! { if_chain! {
if let ItemKind::Impl(Impl { of_trait: Some(ref trait_ref), items: impl_items, .. }) = item.kind; if let ItemKind::Impl(Impl { of_trait: Some(ref trait_ref), items: impl_items, .. }) = item.kind;
if !cx.tcx.has_attr(item.owner_id.to_def_id(), sym::automatically_derived); if !cx.tcx.has_attr(item.owner_id, sym::automatically_derived);
if let Some(eq_trait) = cx.tcx.lang_items().eq_trait(); if let Some(eq_trait) = cx.tcx.lang_items().eq_trait();
if trait_ref.path.res.def_id() == eq_trait; if trait_ref.path.res.def_id() == eq_trait;
then { then {

View file

@ -22,7 +22,7 @@ use log::debug;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use rustc_driver::Compilation; use rustc_driver::Compilation;
use rustc_hir::{self as hir, def_id::LOCAL_CRATE, Node}; use rustc_hir::{self as hir, Node};
use rustc_interface::interface::Config; use rustc_interface::interface::Config;
use rustc_middle::{ use rustc_middle::{
middle::exported_symbols::{ middle::exported_symbols::{
@ -107,8 +107,7 @@ impl rustc_driver::Callbacks for MiriBeRustCompilerCalls {
config.override_queries = Some(|_, local_providers, _| { config.override_queries = Some(|_, local_providers, _| {
// `exported_symbols` and `reachable_non_generics` provided by rustc always returns // `exported_symbols` and `reachable_non_generics` provided by rustc always returns
// an empty result if `tcx.sess.opts.output_types.should_codegen()` is false. // an empty result if `tcx.sess.opts.output_types.should_codegen()` is false.
local_providers.exported_symbols = |tcx, cnum| { local_providers.exported_symbols = |tcx, ()| {
assert_eq!(cnum, LOCAL_CRATE);
let reachable_set = tcx.with_stable_hashing_context(|hcx| { let reachable_set = tcx.with_stable_hashing_context(|hcx| {
tcx.reachable_set(()).to_sorted(&hcx, true) tcx.reachable_set(()).to_sorted(&hcx, true)
}); });