mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #129546 - compiler-errors:no-pred-on, r=fee1-dead
Get rid of `predicates_defined_on` This is the uncontroversial part of #129532. This simply inlines the `predicates_defined_on` into into `predicates_of`. Nothing should change here logically.
This commit is contained in:
commit
748c54848d
@ -34,7 +34,7 @@ use rustc_infer::traits::ObligationCause;
|
|||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
use rustc_middle::ty::util::{Discr, IntTypeExt};
|
use rustc_middle::ty::util::{Discr, IntTypeExt};
|
||||||
use rustc_middle::ty::{self, AdtKind, Const, IsSuggestable, Ty, TyCtxt, Upcast};
|
use rustc_middle::ty::{self, AdtKind, Const, IsSuggestable, Ty, TyCtxt};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
@ -70,7 +70,6 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
impl_super_outlives: item_bounds::impl_super_outlives,
|
impl_super_outlives: item_bounds::impl_super_outlives,
|
||||||
generics_of: generics_of::generics_of,
|
generics_of: generics_of::generics_of,
|
||||||
predicates_of: predicates_of::predicates_of,
|
predicates_of: predicates_of::predicates_of,
|
||||||
predicates_defined_on,
|
|
||||||
explicit_predicates_of: predicates_of::explicit_predicates_of,
|
explicit_predicates_of: predicates_of::explicit_predicates_of,
|
||||||
explicit_super_predicates_of: predicates_of::explicit_super_predicates_of,
|
explicit_super_predicates_of: predicates_of::explicit_super_predicates_of,
|
||||||
explicit_implied_predicates_of: predicates_of::explicit_implied_predicates_of,
|
explicit_implied_predicates_of: predicates_of::explicit_implied_predicates_of,
|
||||||
@ -1775,34 +1774,6 @@ fn early_bound_lifetimes_from_generics<'a, 'tcx: 'a>(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a list of type predicates for the definition with ID `def_id`, including inferred
|
|
||||||
/// lifetime constraints. This includes all predicates returned by `explicit_predicates_of`, plus
|
|
||||||
/// inferred constraints concerning which regions outlive other regions.
|
|
||||||
#[instrument(level = "debug", skip(tcx))]
|
|
||||||
fn predicates_defined_on(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicates<'_> {
|
|
||||||
let mut result = tcx.explicit_predicates_of(def_id);
|
|
||||||
debug!("predicates_defined_on: explicit_predicates_of({:?}) = {:?}", def_id, result);
|
|
||||||
let inferred_outlives = tcx.inferred_outlives_of(def_id);
|
|
||||||
if !inferred_outlives.is_empty() {
|
|
||||||
debug!(
|
|
||||||
"predicates_defined_on: inferred_outlives_of({:?}) = {:?}",
|
|
||||||
def_id, inferred_outlives,
|
|
||||||
);
|
|
||||||
let inferred_outlives_iter =
|
|
||||||
inferred_outlives.iter().map(|(clause, span)| ((*clause).upcast(tcx), *span));
|
|
||||||
if result.predicates.is_empty() {
|
|
||||||
result.predicates = tcx.arena.alloc_from_iter(inferred_outlives_iter);
|
|
||||||
} else {
|
|
||||||
result.predicates = tcx.arena.alloc_from_iter(
|
|
||||||
result.predicates.into_iter().copied().chain(inferred_outlives_iter),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!("predicates_defined_on({:?}) = {:?}", def_id, result);
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
fn compute_sig_of_foreign_fn_decl<'tcx>(
|
fn compute_sig_of_foreign_fn_decl<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def_id: LocalDefId,
|
def_id: LocalDefId,
|
||||||
|
@ -18,10 +18,26 @@ use crate::delegation::inherit_predicates_for_delegation_item;
|
|||||||
use crate::hir_ty_lowering::{HirTyLowerer, OnlySelfBounds, PredicateFilter, RegionInferReason};
|
use crate::hir_ty_lowering::{HirTyLowerer, OnlySelfBounds, PredicateFilter, RegionInferReason};
|
||||||
|
|
||||||
/// Returns a list of all type predicates (explicit and implicit) for the definition with
|
/// Returns a list of all type predicates (explicit and implicit) for the definition with
|
||||||
/// ID `def_id`. This includes all predicates returned by `predicates_defined_on`, plus
|
/// ID `def_id`. This includes all predicates returned by `explicit_predicates_of`, plus
|
||||||
/// `Self: Trait` predicates for traits.
|
/// inferred constraints concerning which regions outlive other regions.
|
||||||
|
#[instrument(level = "debug", skip(tcx))]
|
||||||
pub(super) fn predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicates<'_> {
|
pub(super) fn predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredicates<'_> {
|
||||||
let mut result = tcx.predicates_defined_on(def_id);
|
let mut result = tcx.explicit_predicates_of(def_id);
|
||||||
|
debug!("predicates_of: explicit_predicates_of({:?}) = {:?}", def_id, result);
|
||||||
|
|
||||||
|
let inferred_outlives = tcx.inferred_outlives_of(def_id);
|
||||||
|
if !inferred_outlives.is_empty() {
|
||||||
|
debug!("predicates_of: inferred_outlives_of({:?}) = {:?}", def_id, inferred_outlives,);
|
||||||
|
let inferred_outlives_iter =
|
||||||
|
inferred_outlives.iter().map(|(clause, span)| ((*clause).upcast(tcx), *span));
|
||||||
|
if result.predicates.is_empty() {
|
||||||
|
result.predicates = tcx.arena.alloc_from_iter(inferred_outlives_iter);
|
||||||
|
} else {
|
||||||
|
result.predicates = tcx.arena.alloc_from_iter(
|
||||||
|
result.predicates.into_iter().copied().chain(inferred_outlives_iter),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if tcx.is_trait(def_id) {
|
if tcx.is_trait(def_id) {
|
||||||
// For traits, add `Self: Trait` predicate. This is
|
// For traits, add `Self: Trait` predicate. This is
|
||||||
@ -51,7 +67,8 @@ pub(super) fn predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericPredic
|
|||||||
.chain(std::iter::once((ty::TraitRef::identity(tcx, def_id).upcast(tcx), span))),
|
.chain(std::iter::once((ty::TraitRef::identity(tcx, def_id).upcast(tcx), span))),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
debug!("predicates_of(def_id={:?}) = {:?}", def_id, result);
|
|
||||||
|
debug!("predicates_of({:?}) = {:?}", def_id, result);
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,17 +312,6 @@ rustc_queries! {
|
|||||||
/// predicates (where-clauses) that must be proven true in order
|
/// predicates (where-clauses) that must be proven true in order
|
||||||
/// to reference it. This is almost always the "predicates query"
|
/// to reference it. This is almost always the "predicates query"
|
||||||
/// that you want.
|
/// that you want.
|
||||||
///
|
|
||||||
/// `predicates_of` builds on `predicates_defined_on` -- in fact,
|
|
||||||
/// it is almost always the same as that query, except for the
|
|
||||||
/// case of traits. For traits, `predicates_of` contains
|
|
||||||
/// an additional `Self: Trait<...>` predicate that users don't
|
|
||||||
/// actually write. This reflects the fact that to invoke the
|
|
||||||
/// trait (e.g., via `Default::default`) you must supply types
|
|
||||||
/// that actually implement the trait. (However, this extra
|
|
||||||
/// predicate gets in the way of some checks, which are intended
|
|
||||||
/// to operate over only the actual where-clauses written by the
|
|
||||||
/// user.)
|
|
||||||
query predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
|
query predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
|
||||||
desc { |tcx| "computing predicates of `{}`", tcx.def_path_str(key) }
|
desc { |tcx| "computing predicates of `{}`", tcx.def_path_str(key) }
|
||||||
cache_on_disk_if { key.is_local() }
|
cache_on_disk_if { key.is_local() }
|
||||||
@ -619,14 +608,6 @@ rustc_queries! {
|
|||||||
desc { "getting wasm import module map" }
|
desc { "getting wasm import module map" }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Maps from the `DefId` of an item (trait/struct/enum/fn) to the
|
|
||||||
/// predicates (where-clauses) directly defined on it. This is
|
|
||||||
/// equal to the `explicit_predicates_of` predicates plus the
|
|
||||||
/// `inferred_outlives_of` predicates.
|
|
||||||
query predicates_defined_on(key: DefId) -> ty::GenericPredicates<'tcx> {
|
|
||||||
desc { |tcx| "computing predicates of `{}`", tcx.def_path_str(key) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns everything that looks like a predicate written explicitly
|
/// Returns everything that looks like a predicate written explicitly
|
||||||
/// by the user on a trait item.
|
/// by the user on a trait item.
|
||||||
///
|
///
|
||||||
|
@ -4,11 +4,6 @@ error[E0391]: cycle detected when computing predicates of `Foo`
|
|||||||
LL | struct Foo {
|
LL | struct Foo {
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: ...which requires computing predicates of `Foo`...
|
|
||||||
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
|
||||||
|
|
|
||||||
LL | struct Foo {
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
note: ...which requires computing inferred outlives predicates of `Foo`...
|
note: ...which requires computing inferred outlives predicates of `Foo`...
|
||||||
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
||||||
|
|
|
|
||||||
|
@ -4,11 +4,6 @@ error[E0391]: cycle detected when computing predicates of `user`
|
|||||||
LL | fn user<T>() where S<T>::P: std::fmt::Debug {}
|
LL | fn user<T>() where S<T>::P: std::fmt::Debug {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
note: ...which requires computing predicates of `user`...
|
|
||||||
--> $DIR/cycle-iat-inside-of-where-predicate.rs:8:1
|
|
||||||
|
|
|
||||||
LL | fn user<T>() where S<T>::P: std::fmt::Debug {}
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
note: ...which requires computing explicit predicates of `user`...
|
note: ...which requires computing explicit predicates of `user`...
|
||||||
--> $DIR/cycle-iat-inside-of-where-predicate.rs:8:1
|
--> $DIR/cycle-iat-inside-of-where-predicate.rs:8:1
|
||||||
|
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user