Rollup merge of #135706 - compiler-errors:elaborate, r=lcnr
Move `supertrait_def_ids` into the elaborate module like all other fns It's strange that this is the only elaborate-like fn on tcx. r? lcnr
This commit is contained in:
commit
4af3ff8cd1
11 changed files with 27 additions and 26 deletions
|
@ -39,7 +39,9 @@ use rustc_trait_selection::error_reporting::traits::FindExprBySpan;
|
||||||
use rustc_trait_selection::error_reporting::traits::call_kind::CallKind;
|
use rustc_trait_selection::error_reporting::traits::call_kind::CallKind;
|
||||||
use rustc_trait_selection::infer::InferCtxtExt;
|
use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
|
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||||
use rustc_trait_selection::traits::{Obligation, ObligationCause, ObligationCtxt};
|
use rustc_trait_selection::traits::{
|
||||||
|
Obligation, ObligationCause, ObligationCtxt, supertrait_def_ids,
|
||||||
|
};
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
use super::explain_borrow::{BorrowExplanation, LaterUseKind};
|
use super::explain_borrow::{BorrowExplanation, LaterUseKind};
|
||||||
|
@ -658,8 +660,7 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
|
||||||
clause.as_trait_clause().is_some_and(|tc| {
|
clause.as_trait_clause().is_some_and(|tc| {
|
||||||
tc.self_ty().skip_binder().is_param(param.index)
|
tc.self_ty().skip_binder().is_param(param.index)
|
||||||
&& tc.polarity() == ty::PredicatePolarity::Positive
|
&& tc.polarity() == ty::PredicatePolarity::Positive
|
||||||
&& tcx
|
&& supertrait_def_ids(tcx, tc.def_id())
|
||||||
.supertrait_def_ids(tc.def_id())
|
|
||||||
.flat_map(|trait_did| tcx.associated_items(trait_did).in_definition_order())
|
.flat_map(|trait_did| tcx.associated_items(trait_did).in_definition_order())
|
||||||
.any(|item| item.fn_has_self_parameter)
|
.any(|item| item.fn_has_self_parameter)
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,6 +13,7 @@ use rustc_middle::query::Providers;
|
||||||
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
use rustc_middle::ty::{self, TyCtxt, TypeVisitableExt};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::{ErrorGuaranteed, sym};
|
use rustc_span::{ErrorGuaranteed, sym};
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
|
@ -205,7 +206,7 @@ fn check_object_overlap<'tcx>(
|
||||||
// With the feature enabled, the trait is not implemented automatically,
|
// With the feature enabled, the trait is not implemented automatically,
|
||||||
// so this is valid.
|
// so this is valid.
|
||||||
} else {
|
} else {
|
||||||
let mut supertrait_def_ids = tcx.supertrait_def_ids(component_def_id);
|
let mut supertrait_def_ids = elaborate::supertrait_def_ids(tcx, component_def_id);
|
||||||
if supertrait_def_ids
|
if supertrait_def_ids
|
||||||
.any(|d| d == trait_def_id && tcx.trait_def(d).implement_via_object)
|
.any(|d| d == trait_def_id && tcx.trait_def(d).implement_via_object)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,6 +45,7 @@ use rustc_session::lint;
|
||||||
use rustc_span::def_id::LOCAL_CRATE;
|
use rustc_span::def_id::LOCAL_CRATE;
|
||||||
use rustc_span::{DUMMY_SP, Span, sym};
|
use rustc_span::{DUMMY_SP, Span, sym};
|
||||||
use rustc_trait_selection::infer::InferCtxtExt;
|
use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
use super::FnCtxt;
|
use super::FnCtxt;
|
||||||
|
@ -923,7 +924,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||||
let src_auto: FxHashSet<_> = src_tty
|
let src_auto: FxHashSet<_> = src_tty
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(
|
.chain(
|
||||||
tcx.supertrait_def_ids(src_principal.def_id())
|
elaborate::supertrait_def_ids(tcx, src_principal.def_id())
|
||||||
.filter(|def_id| tcx.trait_is_auto(*def_id)),
|
.filter(|def_id| tcx.trait_is_auto(*def_id)),
|
||||||
)
|
)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -52,7 +52,9 @@ use rustc_type_ir::TyKind::*;
|
||||||
use rustc_type_ir::fold::TypeFoldable;
|
use rustc_type_ir::fold::TypeFoldable;
|
||||||
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
use rustc_type_ir::lang_items::TraitSolverLangItem;
|
||||||
pub use rustc_type_ir::lift::Lift;
|
pub use rustc_type_ir::lift::Lift;
|
||||||
use rustc_type_ir::{CollectAndApply, Interner, TypeFlags, WithCachedTypeInfo, search_graph};
|
use rustc_type_ir::{
|
||||||
|
CollectAndApply, Interner, TypeFlags, WithCachedTypeInfo, elaborate, search_graph,
|
||||||
|
};
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
use crate::arena::Arena;
|
use crate::arena::Arena;
|
||||||
|
@ -2558,7 +2560,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// Given the def_id of a Trait `trait_def_id` and the name of an associated item `assoc_name`
|
/// Given the def_id of a Trait `trait_def_id` and the name of an associated item `assoc_name`
|
||||||
/// returns true if the `trait_def_id` defines an associated item of name `assoc_name`.
|
/// returns true if the `trait_def_id` defines an associated item of name `assoc_name`.
|
||||||
pub fn trait_may_define_assoc_item(self, trait_def_id: DefId, assoc_name: Ident) -> bool {
|
pub fn trait_may_define_assoc_item(self, trait_def_id: DefId, assoc_name: Ident) -> bool {
|
||||||
self.supertrait_def_ids(trait_def_id).any(|trait_did| {
|
elaborate::supertrait_def_ids(self, trait_def_id).any(|trait_did| {
|
||||||
self.associated_items(trait_did)
|
self.associated_items(trait_did)
|
||||||
.filter_by_name_unhygienic(assoc_name.name)
|
.filter_by_name_unhygienic(assoc_name.name)
|
||||||
.any(|item| self.hygienic_eq(assoc_name, item.ident(self), trait_did))
|
.any(|item| self.hygienic_eq(assoc_name, item.ident(self), trait_did))
|
||||||
|
@ -2579,14 +2581,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the def-ids of the transitive supertraits of `trait_def_id`. This (intentionally)
|
|
||||||
/// does not compute the full elaborated super-predicates but just the set of def-ids. It is used
|
|
||||||
/// to identify which traits may define a given associated type to help avoid cycle errors,
|
|
||||||
/// and to make size estimates for vtable layout computation.
|
|
||||||
pub fn supertrait_def_ids(self, trait_def_id: DefId) -> impl Iterator<Item = DefId> + 'tcx {
|
|
||||||
rustc_type_ir::elaborate::supertrait_def_ids(self, trait_def_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Given a closure signature, returns an equivalent fn signature. Detuples
|
/// Given a closure signature, returns an equivalent fn signature. Detuples
|
||||||
/// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
|
/// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then
|
||||||
/// you would get a `fn(u32, i32)`.
|
/// you would get a `fn(u32, i32)`.
|
||||||
|
|
|
@ -2,6 +2,7 @@ use std::fmt;
|
||||||
|
|
||||||
use rustc_ast::Mutability;
|
use rustc_ast::Mutability;
|
||||||
use rustc_macros::HashStable;
|
use rustc_macros::HashStable;
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
|
|
||||||
use crate::mir::interpret::{AllocId, Allocation, CTFE_ALLOC_SALT, Pointer, Scalar, alloc_range};
|
use crate::mir::interpret::{AllocId, Allocation, CTFE_ALLOC_SALT, Pointer, Scalar, alloc_range};
|
||||||
use crate::ty::{self, Instance, PolyTraitRef, Ty, TyCtxt};
|
use crate::ty::{self, Instance, PolyTraitRef, Ty, TyCtxt};
|
||||||
|
@ -64,7 +65,7 @@ pub(crate) fn vtable_min_entries<'tcx>(
|
||||||
};
|
};
|
||||||
|
|
||||||
// This includes self in supertraits.
|
// This includes self in supertraits.
|
||||||
for def_id in tcx.supertrait_def_ids(trait_ref.def_id()) {
|
for def_id in elaborate::supertrait_def_ids(tcx, trait_ref.def_id()) {
|
||||||
count += tcx.own_existential_vtable_entries(def_id).len();
|
count += tcx.own_existential_vtable_entries(def_id).len();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ use rustc_middle::ty::{
|
||||||
TypeVisitableExt, TypeVisitor, TypingMode, Upcast,
|
TypeVisitableExt, TypeVisitor, TypingMode, Upcast,
|
||||||
};
|
};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
|
@ -39,7 +40,7 @@ pub fn hir_ty_lowering_dyn_compatibility_violations(
|
||||||
trait_def_id: DefId,
|
trait_def_id: DefId,
|
||||||
) -> Vec<DynCompatibilityViolation> {
|
) -> Vec<DynCompatibilityViolation> {
|
||||||
debug_assert!(tcx.generics_of(trait_def_id).has_self);
|
debug_assert!(tcx.generics_of(trait_def_id).has_self);
|
||||||
tcx.supertrait_def_ids(trait_def_id)
|
elaborate::supertrait_def_ids(tcx, trait_def_id)
|
||||||
.map(|def_id| predicates_reference_self(tcx, def_id, true))
|
.map(|def_id| predicates_reference_self(tcx, def_id, true))
|
||||||
.filter(|spans| !spans.is_empty())
|
.filter(|spans| !spans.is_empty())
|
||||||
.map(DynCompatibilityViolation::SupertraitSelf)
|
.map(DynCompatibilityViolation::SupertraitSelf)
|
||||||
|
@ -54,7 +55,7 @@ fn dyn_compatibility_violations(
|
||||||
debug!("dyn_compatibility_violations: {:?}", trait_def_id);
|
debug!("dyn_compatibility_violations: {:?}", trait_def_id);
|
||||||
|
|
||||||
tcx.arena.alloc_from_iter(
|
tcx.arena.alloc_from_iter(
|
||||||
tcx.supertrait_def_ids(trait_def_id)
|
elaborate::supertrait_def_ids(tcx, trait_def_id)
|
||||||
.flat_map(|def_id| dyn_compatibility_violations_for_trait(tcx, def_id)),
|
.flat_map(|def_id| dyn_compatibility_violations_for_trait(tcx, def_id)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ pub use self::specialize::{
|
||||||
pub use self::structural_normalize::StructurallyNormalizeExt;
|
pub use self::structural_normalize::StructurallyNormalizeExt;
|
||||||
pub use self::util::{
|
pub use self::util::{
|
||||||
BoundVarReplacer, PlaceholderReplacer, elaborate, expand_trait_aliases, impl_item_is_final,
|
BoundVarReplacer, PlaceholderReplacer, elaborate, expand_trait_aliases, impl_item_is_final,
|
||||||
supertraits, transitive_bounds_that_define_assoc_item, upcast_choices,
|
supertrait_def_ids, supertraits, transitive_bounds_that_define_assoc_item, upcast_choices,
|
||||||
with_replaced_escaping_bound_vars,
|
with_replaced_escaping_bound_vars,
|
||||||
};
|
};
|
||||||
use crate::error_reporting::InferCtxtErrorExt;
|
use crate::error_reporting::InferCtxtErrorExt;
|
||||||
|
|
|
@ -18,6 +18,7 @@ use rustc_middle::ty::visit::TypeVisitableExt;
|
||||||
use rustc_middle::ty::{self, Term, Ty, TyCtxt, TypingMode, Upcast};
|
use rustc_middle::ty::{self, Term, Ty, TyCtxt, TypingMode, Upcast};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
use thin_vec::thin_vec;
|
use thin_vec::thin_vec;
|
||||||
use tracing::{debug, instrument};
|
use tracing::{debug, instrument};
|
||||||
|
|
||||||
|
@ -836,8 +837,7 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>(
|
||||||
if tcx.is_impl_trait_in_trait(obligation.predicate.def_id)
|
if tcx.is_impl_trait_in_trait(obligation.predicate.def_id)
|
||||||
&& let Some(out_trait_def_id) = data.principal_def_id()
|
&& let Some(out_trait_def_id) = data.principal_def_id()
|
||||||
&& let rpitit_trait_def_id = tcx.parent(obligation.predicate.def_id)
|
&& let rpitit_trait_def_id = tcx.parent(obligation.predicate.def_id)
|
||||||
&& tcx
|
&& elaborate::supertrait_def_ids(tcx, out_trait_def_id)
|
||||||
.supertrait_def_ids(out_trait_def_id)
|
|
||||||
.any(|trait_def_id| trait_def_id == rpitit_trait_def_id)
|
.any(|trait_def_id| trait_def_id == rpitit_trait_def_id)
|
||||||
{
|
{
|
||||||
candidate_set.push_candidate(ProjectionCandidate::ObjectRpitit);
|
candidate_set.push_candidate(ProjectionCandidate::ObjectRpitit);
|
||||||
|
|
|
@ -18,7 +18,7 @@ use rustc_infer::traits::{
|
||||||
use rustc_middle::ty::fast_reject::DeepRejectCtxt;
|
use rustc_middle::ty::fast_reject::DeepRejectCtxt;
|
||||||
use rustc_middle::ty::{self, Ty, TypeVisitableExt, TypingMode};
|
use rustc_middle::ty::{self, Ty, TypeVisitableExt, TypingMode};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_type_ir::Interner;
|
use rustc_type_ir::{Interner, elaborate};
|
||||||
use tracing::{debug, instrument, trace};
|
use tracing::{debug, instrument, trace};
|
||||||
|
|
||||||
use super::SelectionCandidate::*;
|
use super::SelectionCandidate::*;
|
||||||
|
@ -1003,8 +1003,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
let a_auto_traits: FxIndexSet<DefId> = a_data
|
let a_auto_traits: FxIndexSet<DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(principal_def_id_a.into_iter().flat_map(|principal_def_id| {
|
.chain(principal_def_id_a.into_iter().flat_map(|principal_def_id| {
|
||||||
self.tcx()
|
elaborate::supertrait_def_ids(self.tcx(), principal_def_id)
|
||||||
.supertrait_def_ids(principal_def_id)
|
|
||||||
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
|
.filter(|def_id| self.tcx().trait_is_auto(*def_id))
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -32,6 +32,7 @@ use rustc_middle::ty::{
|
||||||
TypingMode, Upcast,
|
TypingMode, Upcast,
|
||||||
};
|
};
|
||||||
use rustc_span::{Symbol, sym};
|
use rustc_span::{Symbol, sym};
|
||||||
|
use rustc_type_ir::elaborate;
|
||||||
use tracing::{debug, instrument, trace};
|
use tracing::{debug, instrument, trace};
|
||||||
|
|
||||||
use self::EvaluationResult::*;
|
use self::EvaluationResult::*;
|
||||||
|
@ -2531,7 +2532,8 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
||||||
let a_auto_traits: FxIndexSet<DefId> = a_data
|
let a_auto_traits: FxIndexSet<DefId> = a_data
|
||||||
.auto_traits()
|
.auto_traits()
|
||||||
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
.chain(a_data.principal_def_id().into_iter().flat_map(|principal_def_id| {
|
||||||
tcx.supertrait_def_ids(principal_def_id).filter(|def_id| tcx.trait_is_auto(*def_id))
|
elaborate::supertrait_def_ids(tcx, principal_def_id)
|
||||||
|
.filter(|def_id| tcx.trait_is_auto(*def_id))
|
||||||
}))
|
}))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ use rustc_session::declare_lint_pass;
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::source_map::Spanned;
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
|
use rustc_trait_selection::traits::supertrait_def_ids;
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
/// ### What it does
|
/// ### What it does
|
||||||
|
@ -270,7 +271,7 @@ fn check_trait_items(cx: &LateContext<'_>, visited_trait: &Item<'_>, trait_items
|
||||||
// fill the set with current and super traits
|
// fill the set with current and super traits
|
||||||
fn fill_trait_set(traitt: DefId, set: &mut DefIdSet, cx: &LateContext<'_>) {
|
fn fill_trait_set(traitt: DefId, set: &mut DefIdSet, cx: &LateContext<'_>) {
|
||||||
if set.insert(traitt) {
|
if set.insert(traitt) {
|
||||||
for supertrait in cx.tcx.supertrait_def_ids(traitt) {
|
for supertrait in supertrait_def_ids(cx.tcx, traitt) {
|
||||||
fill_trait_set(supertrait, set, cx);
|
fill_trait_set(supertrait, set, cx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue