Skip to content

Commit 811ef38

Browse files
Auto merge of #145266 - camsteffen:reduce-queries, r=<try>
Reduce some queries around associated items
2 parents fce0e74 + f0df007 commit 811ef38

File tree

13 files changed

+40
-35
lines changed

13 files changed

+40
-35
lines changed

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,10 +1773,10 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
17731773
locations,
17741774
);
17751775

1776-
assert!(!matches!(
1777-
tcx.impl_of_assoc(def_id).map(|imp| tcx.def_kind(imp)),
1776+
assert_ne!(
1777+
tcx.assoc_parent(def_id).map(|parent| tcx.def_kind(parent)),
17781778
Some(DefKind::Impl { of_trait: true })
1779-
));
1779+
);
17801780
self.prove_predicates(
17811781
args.types().map(|ty| ty::ClauseKind::WellFormed(ty.into())),
17821782
locations,

compiler/rustc_codegen_llvm/src/debuginfo/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use rustc_codegen_ssa::mir::debuginfo::VariableKind::*;
1313
use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext, VariableKind};
1414
use rustc_codegen_ssa::traits::*;
1515
use rustc_data_structures::unord::UnordMap;
16+
use rustc_hir::def::DefKind;
1617
use rustc_hir::def_id::{DefId, DefIdMap};
1718
use rustc_index::IndexVec;
1819
use rustc_middle::mir;
@@ -533,13 +534,13 @@ impl<'ll, 'tcx> DebugInfoCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
533534
// First, let's see if this is a method within an inherent impl. Because
534535
// if yes, we want to make the result subroutine DIE a child of the
535536
// subroutine's self-type.
536-
if let Some(impl_def_id) = cx.tcx.impl_of_assoc(instance.def_id()) {
537+
if let Some(assoc_parent) = cx.tcx.assoc_parent(instance.def_id()) {
537538
// If the method does *not* belong to a trait, proceed
538-
if cx.tcx.trait_id_of_impl(impl_def_id).is_none() {
539+
if cx.tcx.def_kind(assoc_parent) == (DefKind::Impl { of_trait: false }) {
539540
let impl_self_ty = cx.tcx.instantiate_and_normalize_erasing_regions(
540541
instance.args,
541542
cx.typing_env(),
542-
cx.tcx.type_of(impl_def_id),
543+
cx.tcx.type_of(assoc_parent),
543544
);
544545

545546
// Only "class" methods are generally understood by LLVM,

compiler/rustc_const_eval/src/interpret/call.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
731731
) {
732732
let tcx = *self.tcx;
733733

734-
let trait_def_id = tcx.trait_of_assoc(def_id).unwrap();
734+
let trait_def_id = tcx.parent(def_id);
735735
let virtual_trait_ref = ty::TraitRef::from_assoc(tcx, trait_def_id, virtual_instance.args);
736736
let existential_trait_ref = ty::ExistentialTraitRef::erase_self_ty(tcx, virtual_trait_ref);
737737
let concrete_trait_ref = existential_trait_ref.with_self_ty(tcx, dyn_ty);

compiler/rustc_hir_analysis/src/check/compare_impl_item.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,10 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
445445
tcx: TyCtxt<'tcx>,
446446
impl_m_def_id: LocalDefId,
447447
) -> Result<&'tcx DefIdMap<ty::EarlyBinder<'tcx, Ty<'tcx>>>, ErrorGuaranteed> {
448-
let impl_m = tcx.opt_associated_item(impl_m_def_id.to_def_id()).unwrap();
449-
let trait_m = tcx.opt_associated_item(impl_m.trait_item_def_id.unwrap()).unwrap();
448+
let impl_m = tcx.associated_item(impl_m_def_id.to_def_id());
449+
let trait_m = tcx.associated_item(impl_m.trait_item_def_id.unwrap());
450450
let impl_trait_ref =
451-
tcx.impl_trait_ref(impl_m.impl_container(tcx).unwrap()).unwrap().instantiate_identity();
451+
tcx.impl_trait_ref(tcx.parent(impl_m_def_id.to_def_id())).unwrap().instantiate_identity();
452452
// First, check a few of the same things as `compare_impl_method`,
453453
// just so we don't ICE during instantiation later.
454454
check_method_is_structurally_compatible(tcx, impl_m, trait_m, impl_trait_ref, true)?;

compiler/rustc_hir_typeck/src/fallback.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ impl<'tcx> Visitor<'tcx> for AnnotateUnitFallbackVisitor<'_, 'tcx> {
695695
// i.e. changing `Default::default()` to `<() as Default>::default()`.
696696
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = expr.kind
697697
&& let Res::Def(DefKind::AssocFn, def_id) = path.res
698-
&& self.fcx.tcx.trait_of_assoc(def_id).is_some()
698+
&& self.fcx.tcx.def_kind(self.fcx.tcx.parent(def_id)) == DefKind::Trait
699699
&& let Some(args) = self.fcx.typeck_results.borrow().node_args_opt(expr.hir_id)
700700
&& let self_ty = args.type_at(0)
701701
&& let Some(vid) = self.fcx.root_vid(self_ty)

compiler/rustc_lint/src/pass_by_value.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use rustc_hir::attrs::AttributeKind;
2-
use rustc_hir::def::Res;
2+
use rustc_hir::def::{DefKind, Res};
33
use rustc_hir::{self as hir, AmbigArg, GenericArg, PathSegment, QPath, TyKind, find_attr};
44
use rustc_middle::ty;
55
use rustc_session::{declare_lint_pass, declare_tool_lint};
@@ -24,10 +24,10 @@ impl<'tcx> LateLintPass<'tcx> for PassByValue {
2424
fn check_ty(&mut self, cx: &LateContext<'_>, ty: &'tcx hir::Ty<'tcx, AmbigArg>) {
2525
match &ty.kind {
2626
TyKind::Ref(_, hir::MutTy { ty: inner_ty, mutbl: hir::Mutability::Not }) => {
27-
if let Some(impl_did) = cx.tcx.impl_of_assoc(ty.hir_id.owner.to_def_id()) {
28-
if cx.tcx.impl_trait_ref(impl_did).is_some() {
29-
return;
30-
}
27+
if let Some(parent) = cx.tcx.assoc_parent(ty.hir_id.owner.to_def_id())
28+
&& cx.tcx.def_kind(parent) == (DefKind::Impl { of_trait: true })
29+
{
30+
return;
3131
}
3232
if let Some(t) = path_for_pass_by_value(cx, inner_ty) {
3333
cx.emit_span_lint(

compiler/rustc_lint/src/types.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::ops::ControlFlow;
44
use rustc_abi::{BackendRepr, TagEncoding, VariantIdx, Variants, WrappingRange};
55
use rustc_data_structures::fx::FxHashSet;
66
use rustc_errors::DiagMessage;
7+
use rustc_hir::def::DefKind;
78
use rustc_hir::intravisit::VisitorExt;
89
use rustc_hir::{AmbigArg, Expr, ExprKind, HirId, LangItem};
910
use rustc_middle::bug;
@@ -1904,10 +1905,10 @@ impl InvalidAtomicOrdering {
19041905
if let ExprKind::MethodCall(method_path, _, args, _) = &expr.kind
19051906
&& recognized_names.contains(&method_path.ident.name)
19061907
&& let Some(m_def_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
1907-
&& let Some(impl_did) = cx.tcx.impl_of_assoc(m_def_id)
1908-
&& let Some(adt) = cx.tcx.type_of(impl_did).instantiate_identity().ty_adt_def()
1908+
&& let impl_did = cx.tcx.parent(m_def_id)
19091909
// skip extension traits, only lint functions from the standard library
1910-
&& cx.tcx.trait_id_of_impl(impl_did).is_none()
1910+
&& cx.tcx.def_kind(impl_did) == (DefKind::Impl { of_trait: false })
1911+
&& let Some(adt) = cx.tcx.type_of(impl_did).instantiate_identity().ty_adt_def()
19111912
&& let parent = cx.tcx.parent(adt.did())
19121913
&& cx.tcx.is_diagnostic_item(sym::atomic_mod, parent)
19131914
&& ATOMIC_TYPES.contains(&cx.tcx.item_name(adt.did()))

compiler/rustc_middle/src/middle/privacy.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,10 @@ impl EffectiveVisibilities {
180180
// All effective visibilities except `reachable_through_impl_trait` are limited to
181181
// nominal visibility. For some items nominal visibility doesn't make sense so we
182182
// don't check this condition for them.
183-
let is_impl = matches!(tcx.def_kind(def_id), DefKind::Impl { .. });
184-
let is_associated_item_in_trait_impl = tcx
185-
.impl_of_assoc(def_id.to_def_id())
186-
.and_then(|impl_id| tcx.trait_id_of_impl(impl_id))
187-
.is_some();
183+
let def_kind = tcx.def_kind(def_id);
184+
let is_impl = matches!(def_kind, DefKind::Impl { .. });
185+
let is_associated_item_in_trait_impl = def_kind.is_assoc()
186+
&& tcx.def_kind(tcx.parent(def_id.to_def_id())) == DefKind::Impl { of_trait: true };
188187
if !is_impl && !is_associated_item_in_trait_impl {
189188
let nominal_vis = tcx.visibility(def_id);
190189
if !nominal_vis.is_at_least(ev.reachable, tcx) {

compiler/rustc_mir_transform/src/check_call_recursion.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ impl<'tcx> MirLint<'tcx> for CheckDropRecursion {
4343

4444
// First check if `body` is an `fn drop()` of `Drop`
4545
if let DefKind::AssocFn = tcx.def_kind(def_id)
46-
&& let Some(trait_ref) =
47-
tcx.impl_of_assoc(def_id.to_def_id()).and_then(|def_id| tcx.impl_trait_ref(def_id))
46+
&& let impl_id = tcx.parent(def_id.to_def_id())
47+
&& tcx.def_kind(impl_id) == (DefKind::Impl { of_trait: true })
48+
&& let trait_ref = tcx.impl_trait_ref(impl_id).unwrap()
4849
&& tcx.is_lang_item(trait_ref.instantiate_identity().def_id, LangItem::Drop)
4950
// avoid erroneous `Drop` impls from causing ICEs below
5051
&& let sig = tcx.fn_sig(def_id).instantiate_identity()

compiler/rustc_mir_transform/src/check_packed_ref.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use rustc_hir::def::DefKind;
12
use rustc_middle::mir::visit::{PlaceContext, Visitor};
23
use rustc_middle::mir::*;
34
use rustc_middle::span_bug;
@@ -40,7 +41,8 @@ impl<'tcx> Visitor<'tcx> for PackedRefChecker<'_, 'tcx> {
4041
if context.is_borrow() && util::is_disaligned(self.tcx, self.body, self.typing_env, *place)
4142
{
4243
let def_id = self.body.source.instance.def_id();
43-
if let Some(impl_def_id) = self.tcx.impl_of_assoc(def_id)
44+
if let Some(impl_def_id) = self.tcx.assoc_parent(def_id)
45+
&& self.tcx.def_kind(impl_def_id) == (DefKind::Impl { of_trait: true })
4446
&& self.tcx.is_builtin_derived(impl_def_id)
4547
{
4648
// If we ever reach here it means that the generated derive

0 commit comments

Comments
 (0)