Auto merge of #110031 - compiler-errors:generic-elaboration, r=b-naber
Make elaboration generic over input Combines all the `elaborate_*` family of functions into just one, which is an iterator over the same type that you pass in (e.g. elaborating `Predicate` gives `Predicate`s, elaborating `Obligation`s gives `Obligation`s, etc.)
This commit is contained in:
commit
f8ed97ecc1
22 changed files with 163 additions and 164 deletions
|
@ -9,7 +9,7 @@ use itertools::Itertools;
|
|||
use rustc_data_structures::fx::FxIndexSet;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_infer::traits::util::elaborate_predicates;
|
||||
use rustc_infer::traits::util::elaborate;
|
||||
use rustc_middle::traits::solve::{CanonicalResponse, Certainty, Goal, MaybeCause, QueryResult};
|
||||
use rustc_middle::ty::fast_reject::TreatProjections;
|
||||
use rustc_middle::ty::TypeFoldable;
|
||||
|
@ -498,7 +498,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||
let tcx = self.tcx();
|
||||
let own_bounds: FxIndexSet<_> =
|
||||
bounds.iter().map(|bound| bound.with_self_ty(tcx, self_ty)).collect();
|
||||
for assumption in elaborate_predicates(tcx, own_bounds.iter().copied()) {
|
||||
for assumption in elaborate(tcx, own_bounds.iter().copied()) {
|
||||
// FIXME: Predicates are fully elaborated in the object type's existential bounds
|
||||
// list. We want to only consider these pre-elaborated projections, and not other
|
||||
// projection predicates that we reach by elaborating the principal trait ref,
|
||||
|
|
|
@ -234,7 +234,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
/// constructed once for a given type. As part of the construction process, the `ParamEnv` will
|
||||
/// have any supertrait bounds normalized -- e.g., if we have a type `struct Foo<T: Copy>`, the
|
||||
/// `ParamEnv` will contain `T: Copy` and `T: Clone`, since `Copy: Clone`. When we construct our
|
||||
/// own `ParamEnv`, we need to do this ourselves, through `traits::elaborate_predicates`, or
|
||||
/// own `ParamEnv`, we need to do this ourselves, through `traits::elaborate`, or
|
||||
/// else `SelectionContext` will choke on the missing predicates. However, this should never
|
||||
/// show up in the final synthesized generics: we don't want our generated docs page to contain
|
||||
/// something like `T: Copy + Clone`, as that's redundant. Therefore, we keep track of a
|
||||
|
@ -346,10 +346,8 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
_ => panic!("Unexpected error for '{:?}': {:?}", ty, result),
|
||||
};
|
||||
|
||||
let normalized_preds = elaborate_predicates(
|
||||
tcx,
|
||||
computed_preds.clone().chain(user_computed_preds.iter().cloned()),
|
||||
);
|
||||
let normalized_preds =
|
||||
elaborate(tcx, computed_preds.clone().chain(user_computed_preds.iter().cloned()));
|
||||
new_env = ty::ParamEnv::new(
|
||||
tcx.mk_predicates_from_iter(normalized_preds),
|
||||
param_env.reveal(),
|
||||
|
|
|
@ -368,7 +368,7 @@ fn negative_impl_exists<'tcx>(
|
|||
}
|
||||
|
||||
// Try to prove a negative obligation exists for super predicates
|
||||
for pred in util::elaborate_predicates(infcx.tcx, iter::once(o.predicate)) {
|
||||
for pred in util::elaborate(infcx.tcx, iter::once(o.predicate)) {
|
||||
if resolve_negative_obligation(infcx.fork(), &o.with(infcx.tcx, pred), body_def_id) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use rustc_hir::def_id::DefId;
|
||||
use rustc_infer::infer::{InferCtxt, LateBoundRegionConversionTime};
|
||||
use rustc_infer::traits::util::elaborate_predicates_with_span;
|
||||
use rustc_infer::traits::util::elaborate;
|
||||
use rustc_infer::traits::{Obligation, ObligationCause, TraitObligation};
|
||||
use rustc_middle::ty;
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
|
@ -82,7 +82,7 @@ pub fn recompute_applicable_impls<'tcx>(
|
|||
|
||||
let predicates =
|
||||
tcx.predicates_of(obligation.cause.body_id.to_def_id()).instantiate_identity(tcx);
|
||||
for (pred, span) in elaborate_predicates_with_span(tcx, predicates.into_iter()) {
|
||||
for (pred, span) in elaborate(tcx, predicates.into_iter()) {
|
||||
let kind = pred.kind();
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)) = kind.skip_binder()
|
||||
&& param_env_candidate_may_apply(kind.rebind(trait_pred))
|
||||
|
|
|
@ -1624,7 +1624,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
};
|
||||
|
||||
for pred in super::elaborate_predicates(self.tcx, std::iter::once(cond)) {
|
||||
for pred in super::elaborate(self.tcx, std::iter::once(cond)) {
|
||||
let bound_predicate = pred.kind();
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(implication)) =
|
||||
bound_predicate.skip_binder()
|
||||
|
|
|
@ -58,10 +58,7 @@ pub use self::specialize::{specialization_graph, translate_substs, OverlapError}
|
|||
pub use self::structural_match::{
|
||||
search_for_adt_const_param_violation, search_for_structural_match_violation,
|
||||
};
|
||||
pub use self::util::{
|
||||
elaborate_obligations, elaborate_predicates, elaborate_predicates_with_span,
|
||||
elaborate_trait_ref, elaborate_trait_refs,
|
||||
};
|
||||
pub use self::util::elaborate;
|
||||
pub use self::util::{expand_trait_aliases, TraitAliasExpander};
|
||||
pub use self::util::{get_vtable_index_of_object_method, impl_item_is_final, upcast_choices};
|
||||
pub use self::util::{
|
||||
|
@ -267,7 +264,7 @@ pub fn normalize_param_env_or_error<'tcx>(
|
|||
// and errors will get reported then; so outside of type inference we
|
||||
// can be sure that no errors should occur.
|
||||
let mut predicates: Vec<_> =
|
||||
util::elaborate_predicates(tcx, unnormalized_env.caller_bounds().into_iter()).collect();
|
||||
util::elaborate(tcx, unnormalized_env.caller_bounds().into_iter()).collect();
|
||||
|
||||
debug!("normalize_param_env_or_error: elaborated-predicates={:?}", predicates);
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
//! - not reference the erased type `Self` except for in this receiver;
|
||||
//! - not have generic type parameters.
|
||||
|
||||
use super::{elaborate_predicates, elaborate_trait_ref};
|
||||
use super::elaborate;
|
||||
|
||||
use crate::infer::TyCtxtInferExt;
|
||||
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
||||
|
@ -379,7 +379,7 @@ fn generics_require_sized_self(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
|||
// Search for a predicate like `Self : Sized` amongst the trait bounds.
|
||||
let predicates = tcx.predicates_of(def_id);
|
||||
let predicates = predicates.instantiate_identity(tcx).predicates;
|
||||
elaborate_predicates(tcx, predicates.into_iter()).any(|pred| match pred.kind().skip_binder() {
|
||||
elaborate(tcx, predicates.into_iter()).any(|pred| match pred.kind().skip_binder() {
|
||||
ty::PredicateKind::Clause(ty::Clause::Trait(ref trait_pred)) => {
|
||||
trait_pred.def_id() == sized_def_id && trait_pred.self_ty().is_param(0)
|
||||
}
|
||||
|
@ -666,7 +666,8 @@ fn object_ty_for_trait<'tcx>(
|
|||
});
|
||||
debug!(?trait_predicate);
|
||||
|
||||
let mut elaborated_predicates: Vec<_> = elaborate_trait_ref(tcx, trait_ref)
|
||||
let pred: ty::Predicate<'tcx> = trait_ref.to_predicate(tcx);
|
||||
let mut elaborated_predicates: Vec<_> = elaborate(tcx, [pred])
|
||||
.filter_map(|pred| {
|
||||
debug!(?pred);
|
||||
let pred = pred.to_opt_poly_projection_pred()?;
|
||||
|
|
|
@ -364,7 +364,7 @@ impl<'tcx> WfPredicates<'tcx> {
|
|||
};
|
||||
|
||||
if let Elaborate::All = elaborate {
|
||||
let implied_obligations = traits::util::elaborate_obligations(tcx, obligations);
|
||||
let implied_obligations = traits::util::elaborate(tcx, obligations);
|
||||
let implied_obligations = implied_obligations.map(extend);
|
||||
self.out.extend(implied_obligations);
|
||||
} else {
|
||||
|
@ -920,7 +920,7 @@ pub(crate) fn required_region_bounds<'tcx>(
|
|||
) -> Vec<ty::Region<'tcx>> {
|
||||
assert!(!erased_self_ty.has_escaping_bound_vars());
|
||||
|
||||
traits::elaborate_predicates(tcx, predicates)
|
||||
traits::elaborate(tcx, predicates)
|
||||
.filter_map(|pred| {
|
||||
debug!(?pred);
|
||||
match pred.kind().skip_binder() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue