Split implied and super predicate queries
This commit is contained in:
parent
3dab259cb9
commit
25c342f30a
16 changed files with 125 additions and 96 deletions
|
@ -64,9 +64,9 @@ pub fn provide(providers: &mut Providers) {
|
||||||
predicates_defined_on,
|
predicates_defined_on,
|
||||||
explicit_predicates_of: predicates_of::explicit_predicates_of,
|
explicit_predicates_of: predicates_of::explicit_predicates_of,
|
||||||
super_predicates_of: predicates_of::super_predicates_of,
|
super_predicates_of: predicates_of::super_predicates_of,
|
||||||
super_predicates_that_define_assoc_type: |tcx, (def_id, assoc_name)| {
|
implied_predicates_of: predicates_of::implied_predicates_of,
|
||||||
predicates_of::super_predicates_that_define_assoc_type(tcx, (def_id, Some(assoc_name)))
|
super_predicates_that_define_assoc_type:
|
||||||
},
|
predicates_of::super_predicates_that_define_assoc_type,
|
||||||
trait_explicit_predicates_and_bounds: predicates_of::trait_explicit_predicates_and_bounds,
|
trait_explicit_predicates_and_bounds: predicates_of::trait_explicit_predicates_and_bounds,
|
||||||
type_param_predicates: predicates_of::type_param_predicates,
|
type_param_predicates: predicates_of::type_param_predicates,
|
||||||
trait_def,
|
trait_def,
|
||||||
|
@ -597,6 +597,7 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) {
|
||||||
}
|
}
|
||||||
hir::ItemKind::TraitAlias(..) => {
|
hir::ItemKind::TraitAlias(..) => {
|
||||||
tcx.ensure().generics_of(def_id);
|
tcx.ensure().generics_of(def_id);
|
||||||
|
tcx.at(it.span).implied_predicates_of(def_id);
|
||||||
tcx.at(it.span).super_predicates_of(def_id);
|
tcx.at(it.span).super_predicates_of(def_id);
|
||||||
tcx.ensure().predicates_of(def_id);
|
tcx.ensure().predicates_of(def_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,7 +125,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Gen
|
||||||
// on a trait we need to add in the supertrait bounds and bounds found on
|
// on a trait we need to add in the supertrait bounds and bounds found on
|
||||||
// associated types.
|
// associated types.
|
||||||
if let Some(_trait_ref) = is_trait {
|
if let Some(_trait_ref) = is_trait {
|
||||||
predicates.extend(tcx.super_predicates_of(def_id).predicates.iter().cloned());
|
predicates.extend(tcx.implied_predicates_of(def_id).predicates.iter().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
// In default impls, we can assume that the self type implements
|
// In default impls, we can assume that the self type implements
|
||||||
|
@ -534,6 +534,19 @@ pub(super) fn explicit_predicates_of<'tcx>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
pub enum PredicateFilter {
|
||||||
|
/// All predicates may be implied by the trait
|
||||||
|
All,
|
||||||
|
|
||||||
|
/// Only traits that reference `Self: ..` are implied by the trait
|
||||||
|
SelfOnly,
|
||||||
|
|
||||||
|
/// Only traits that reference `Self: ..` and define an associated type
|
||||||
|
/// with the given ident are implied by the trait
|
||||||
|
SelfThatDefines(Ident),
|
||||||
|
}
|
||||||
|
|
||||||
/// Ensures that the super-predicates of the trait with a `DefId`
|
/// Ensures that the super-predicates of the trait with a `DefId`
|
||||||
/// of `trait_def_id` are converted and stored. This also ensures that
|
/// of `trait_def_id` are converted and stored. This also ensures that
|
||||||
/// the transitive super-predicates are converted.
|
/// the transitive super-predicates are converted.
|
||||||
|
@ -541,24 +554,42 @@ pub(super) fn super_predicates_of(
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
trait_def_id: LocalDefId,
|
trait_def_id: LocalDefId,
|
||||||
) -> ty::GenericPredicates<'_> {
|
) -> ty::GenericPredicates<'_> {
|
||||||
tcx.super_predicates_that_define_assoc_type((trait_def_id.to_def_id(), None))
|
implied_predicates_with_filter(tcx, trait_def_id.to_def_id(), PredicateFilter::SelfOnly)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn super_predicates_that_define_assoc_type(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
(trait_def_id, assoc_name): (DefId, Ident),
|
||||||
|
) -> ty::GenericPredicates<'_> {
|
||||||
|
implied_predicates_with_filter(tcx, trait_def_id, PredicateFilter::SelfThatDefines(assoc_name))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn implied_predicates_of(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
trait_def_id: LocalDefId,
|
||||||
|
) -> ty::GenericPredicates<'_> {
|
||||||
|
if tcx.is_trait_alias(trait_def_id.to_def_id()) {
|
||||||
|
implied_predicates_with_filter(tcx, trait_def_id.to_def_id(), PredicateFilter::All)
|
||||||
|
} else {
|
||||||
|
tcx.super_predicates_of(trait_def_id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ensures that the super-predicates of the trait with a `DefId`
|
/// Ensures that the super-predicates of the trait with a `DefId`
|
||||||
/// of `trait_def_id` are converted and stored. This also ensures that
|
/// of `trait_def_id` are converted and stored. This also ensures that
|
||||||
/// the transitive super-predicates are converted.
|
/// the transitive super-predicates are converted.
|
||||||
pub(super) fn super_predicates_that_define_assoc_type(
|
pub(super) fn implied_predicates_with_filter(
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
(trait_def_id, assoc_name): (DefId, Option<Ident>),
|
trait_def_id: DefId,
|
||||||
|
filter: PredicateFilter,
|
||||||
) -> ty::GenericPredicates<'_> {
|
) -> ty::GenericPredicates<'_> {
|
||||||
let Some(trait_def_id) = trait_def_id.as_local() else {
|
let Some(trait_def_id) = trait_def_id.as_local() else {
|
||||||
// if `assoc_name` is None, then the query should've been redirected to an
|
// if `assoc_name` is None, then the query should've been redirected to an
|
||||||
// external provider
|
// external provider
|
||||||
assert!(assoc_name.is_some());
|
assert!(matches!(filter, PredicateFilter::SelfThatDefines(_)));
|
||||||
return tcx.super_predicates_of(trait_def_id);
|
return tcx.super_predicates_of(trait_def_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("local trait");
|
|
||||||
let trait_hir_id = tcx.hir().local_def_id_to_hir_id(trait_def_id);
|
let trait_hir_id = tcx.hir().local_def_id_to_hir_id(trait_def_id);
|
||||||
|
|
||||||
let Node::Item(item) = tcx.hir().get(trait_hir_id) else {
|
let Node::Item(item) = tcx.hir().get(trait_hir_id) else {
|
||||||
|
@ -573,40 +604,58 @@ pub(super) fn super_predicates_that_define_assoc_type(
|
||||||
|
|
||||||
let icx = ItemCtxt::new(tcx, trait_def_id);
|
let icx = ItemCtxt::new(tcx, trait_def_id);
|
||||||
|
|
||||||
// Convert the bounds that follow the colon, e.g., `Bar + Zed` in `trait Foo: Bar + Zed`.
|
|
||||||
let self_param_ty = tcx.types.self_param;
|
let self_param_ty = tcx.types.self_param;
|
||||||
let superbounds1 = if let Some(assoc_name) = assoc_name {
|
let (superbounds, where_bounds_that_match) = match filter {
|
||||||
icx.astconv().compute_bounds_that_match_assoc_type(self_param_ty, bounds, assoc_name)
|
PredicateFilter::All => (
|
||||||
} else {
|
// Convert the bounds that follow the colon (or equal in trait aliases)
|
||||||
icx.astconv().compute_bounds(self_param_ty, bounds)
|
icx.astconv().compute_bounds(self_param_ty, bounds),
|
||||||
|
// Also include all where clause bounds
|
||||||
|
icx.type_parameter_bounds_in_generics(
|
||||||
|
generics,
|
||||||
|
item.owner_id.def_id,
|
||||||
|
self_param_ty,
|
||||||
|
OnlySelfBounds(false),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PredicateFilter::SelfOnly => (
|
||||||
|
// Convert the bounds that follow the colon (or equal in trait aliases)
|
||||||
|
icx.astconv().compute_bounds(self_param_ty, bounds),
|
||||||
|
// Include where clause bounds for `Self`
|
||||||
|
icx.type_parameter_bounds_in_generics(
|
||||||
|
generics,
|
||||||
|
item.owner_id.def_id,
|
||||||
|
self_param_ty,
|
||||||
|
OnlySelfBounds(true),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PredicateFilter::SelfThatDefines(assoc_name) => (
|
||||||
|
// Convert the bounds that follow the colon (or equal) that reference the associated name
|
||||||
|
icx.astconv().compute_bounds_that_match_assoc_type(self_param_ty, bounds, assoc_name),
|
||||||
|
// Include where clause bounds for `Self` that reference the associated name
|
||||||
|
icx.type_parameter_bounds_in_generics(
|
||||||
|
generics,
|
||||||
|
item.owner_id.def_id,
|
||||||
|
self_param_ty,
|
||||||
|
OnlySelfBounds(true),
|
||||||
|
Some(assoc_name),
|
||||||
|
),
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let superbounds1 = superbounds1.predicates();
|
|
||||||
|
|
||||||
// Convert any explicit superbounds in the where-clause,
|
|
||||||
// e.g., `trait Foo where Self: Bar`.
|
|
||||||
// In the case of trait aliases, however, we include all bounds in the where-clause,
|
|
||||||
// so e.g., `trait Foo = where u32: PartialEq<Self>` would include `u32: PartialEq<Self>`
|
|
||||||
// as one of its "superpredicates".
|
|
||||||
let is_trait_alias = tcx.is_trait_alias(trait_def_id.to_def_id());
|
|
||||||
let superbounds2 = icx.type_parameter_bounds_in_generics(
|
|
||||||
generics,
|
|
||||||
item.owner_id.def_id,
|
|
||||||
self_param_ty,
|
|
||||||
OnlySelfBounds(!is_trait_alias),
|
|
||||||
assoc_name,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Combine the two lists to form the complete set of superbounds:
|
// Combine the two lists to form the complete set of superbounds:
|
||||||
let superbounds = &*tcx.arena.alloc_from_iter(superbounds1.into_iter().chain(superbounds2));
|
let implied_bounds = &*tcx
|
||||||
debug!(?superbounds);
|
.arena
|
||||||
|
.alloc_from_iter(superbounds.predicates().into_iter().chain(where_bounds_that_match));
|
||||||
|
debug!(?implied_bounds);
|
||||||
|
|
||||||
// Now require that immediate supertraits are converted,
|
// Now require that immediate supertraits are converted,
|
||||||
// which will, in turn, reach indirect supertraits.
|
// which will, in turn, reach indirect supertraits.
|
||||||
if assoc_name.is_none() {
|
if matches!(filter, PredicateFilter::SelfOnly) {
|
||||||
// Now require that immediate supertraits are converted,
|
// Now require that immediate supertraits are converted,
|
||||||
// which will, in turn, reach indirect supertraits.
|
// which will, in turn, reach indirect supertraits.
|
||||||
for &(pred, span) in superbounds {
|
for &(pred, span) in implied_bounds {
|
||||||
debug!("superbound: {:?}", pred);
|
debug!("superbound: {:?}", pred);
|
||||||
if let ty::PredicateKind::Clause(ty::Clause::Trait(bound)) = pred.kind().skip_binder() {
|
if let ty::PredicateKind::Clause(ty::Clause::Trait(bound)) = pred.kind().skip_binder() {
|
||||||
tcx.at(span).super_predicates_of(bound.def_id());
|
tcx.at(span).super_predicates_of(bound.def_id());
|
||||||
|
@ -614,7 +663,7 @@ pub(super) fn super_predicates_that_define_assoc_type(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::GenericPredicates { parent: None, predicates: superbounds }
|
ty::GenericPredicates { parent: None, predicates: implied_bounds }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the predicates defined on `item_def_id` of the form
|
/// Returns the predicates defined on `item_def_id` of the form
|
||||||
|
|
|
@ -192,7 +192,7 @@ impl<'tcx, O: Elaboratable<'tcx>> Elaborator<'tcx, O> {
|
||||||
match bound_predicate.skip_binder() {
|
match bound_predicate.skip_binder() {
|
||||||
ty::PredicateKind::Clause(ty::Clause::Trait(data)) => {
|
ty::PredicateKind::Clause(ty::Clause::Trait(data)) => {
|
||||||
// Get predicates declared on the trait.
|
// Get predicates declared on the trait.
|
||||||
let predicates = tcx.super_predicates_of(data.def_id());
|
let predicates = tcx.implied_predicates_of(data.def_id());
|
||||||
|
|
||||||
let obligations =
|
let obligations =
|
||||||
predicates.predicates.iter().enumerate().map(|(index, &(mut pred, span))| {
|
predicates.predicates.iter().enumerate().map(|(index, &(mut pred, span))| {
|
||||||
|
|
|
@ -253,7 +253,19 @@ provide! { tcx, def_id, other, cdata,
|
||||||
.get(cdata, def_id.index)
|
.get(cdata, def_id.index)
|
||||||
.map(|lazy| lazy.decode((cdata, tcx)))
|
.map(|lazy| lazy.decode((cdata, tcx)))
|
||||||
.process_decoded(tcx, || panic!("{def_id:?} does not have trait_impl_trait_tys")))
|
.process_decoded(tcx, || panic!("{def_id:?} does not have trait_impl_trait_tys")))
|
||||||
}
|
}
|
||||||
|
implied_predicates_of => {
|
||||||
|
cdata
|
||||||
|
.root
|
||||||
|
.tables
|
||||||
|
.implied_predicates_of
|
||||||
|
.get(cdata, def_id.index)
|
||||||
|
.map(|lazy| lazy.decode((cdata, tcx)))
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
debug_assert_eq!(tcx.def_kind(def_id), DefKind::Trait);
|
||||||
|
tcx.super_predicates_of(def_id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
associated_types_for_impl_traits_in_associated_fn => { table_defaulted_array }
|
associated_types_for_impl_traits_in_associated_fn => { table_defaulted_array }
|
||||||
|
|
||||||
|
|
|
@ -1316,9 +1316,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||||
let default = self.tcx.object_lifetime_default(def_id);
|
let default = self.tcx.object_lifetime_default(def_id);
|
||||||
record!(self.tables.object_lifetime_default[def_id] <- default);
|
record!(self.tables.object_lifetime_default[def_id] <- default);
|
||||||
}
|
}
|
||||||
if let DefKind::Trait | DefKind::TraitAlias = def_kind {
|
if let DefKind::Trait = def_kind {
|
||||||
record!(self.tables.super_predicates_of[def_id] <- self.tcx.super_predicates_of(def_id));
|
record!(self.tables.super_predicates_of[def_id] <- self.tcx.super_predicates_of(def_id));
|
||||||
}
|
}
|
||||||
|
if let DefKind::TraitAlias = def_kind {
|
||||||
|
record!(self.tables.super_predicates_of[def_id] <- self.tcx.super_predicates_of(def_id));
|
||||||
|
record!(self.tables.implied_predicates_of[def_id] <- self.tcx.implied_predicates_of(def_id));
|
||||||
|
}
|
||||||
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
|
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
|
||||||
self.encode_info_for_adt(def_id);
|
self.encode_info_for_adt(def_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,6 +372,9 @@ define_tables! {
|
||||||
explicit_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>,
|
explicit_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>,
|
||||||
generics_of: Table<DefIndex, LazyValue<ty::Generics>>,
|
generics_of: Table<DefIndex, LazyValue<ty::Generics>>,
|
||||||
super_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>,
|
super_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>,
|
||||||
|
// As an optimization, we only store this for trait aliases,
|
||||||
|
// since it's identical to super_predicates_of for traits.
|
||||||
|
implied_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>,
|
||||||
type_of: Table<DefIndex, LazyValue<ty::EarlyBinder<Ty<'static>>>>,
|
type_of: Table<DefIndex, LazyValue<ty::EarlyBinder<Ty<'static>>>>,
|
||||||
variances_of: Table<DefIndex, LazyArray<ty::Variance>>,
|
variances_of: Table<DefIndex, LazyArray<ty::Variance>>,
|
||||||
fn_sig: Table<DefIndex, LazyValue<ty::EarlyBinder<ty::PolyFnSig<'static>>>>,
|
fn_sig: Table<DefIndex, LazyValue<ty::EarlyBinder<ty::PolyFnSig<'static>>>>,
|
||||||
|
@ -383,7 +386,6 @@ define_tables! {
|
||||||
mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>,
|
mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>,
|
||||||
mir_generator_witnesses: Table<DefIndex, LazyValue<mir::GeneratorLayout<'static>>>,
|
mir_generator_witnesses: Table<DefIndex, LazyValue<mir::GeneratorLayout<'static>>>,
|
||||||
promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>,
|
promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>,
|
||||||
// FIXME(compiler-errors): Why isn't this a LazyArray?
|
|
||||||
thir_abstract_const: Table<DefIndex, LazyValue<ty::Const<'static>>>,
|
thir_abstract_const: Table<DefIndex, LazyValue<ty::Const<'static>>>,
|
||||||
impl_parent: Table<DefIndex, RawDefId>,
|
impl_parent: Table<DefIndex, RawDefId>,
|
||||||
impl_polarity: Table<DefIndex, ty::ImplPolarity>,
|
impl_polarity: Table<DefIndex, ty::ImplPolarity>,
|
||||||
|
|
|
@ -627,6 +627,12 @@ rustc_queries! {
|
||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query implied_predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> {
|
||||||
|
desc { |tcx| "computing the implied predicates of `{}`", tcx.def_path_str(key) }
|
||||||
|
cache_on_disk_if { key.is_local() }
|
||||||
|
separate_provide_extern
|
||||||
|
}
|
||||||
|
|
||||||
/// The `Option<Ident>` is the name of an associated type. If it is `None`, then this query
|
/// The `Option<Ident>` is the name of an associated type. If it is `None`, then this query
|
||||||
/// returns the full set of predicates. If `Some<Ident>`, then the query returns only the
|
/// returns the full set of predicates. If `Some<Ident>`, then the query returns only the
|
||||||
/// subset of super-predicates that reference traits that define the given associated type.
|
/// subset of super-predicates that reference traits that define the given associated type.
|
||||||
|
|
|
@ -115,7 +115,7 @@ impl<'tcx> TraitAliasExpander<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get components of trait alias.
|
// Get components of trait alias.
|
||||||
let predicates = tcx.super_predicates_of(trait_ref.def_id());
|
let predicates = tcx.implied_predicates_of(trait_ref.def_id());
|
||||||
debug!(?predicates);
|
debug!(?predicates);
|
||||||
|
|
||||||
let items = predicates.predicates.iter().rev().filter_map(|(pred, span)| {
|
let items = predicates.predicates.iter().rev().filter_map(|(pred, span)| {
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | trait Baz: Foo + Bar<Self::Item> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: ...which immediately requires computing the super traits of `Baz` with associated type name `Item` again
|
= note: ...which immediately requires computing the super traits of `Baz` with associated type name `Item` again
|
||||||
note: cycle used when computing the super traits of `Baz`
|
note: cycle used when computing the super predicates of `Baz`
|
||||||
--> $DIR/ambiguous-associated-type2.rs:7:1
|
--> $DIR/ambiguous-associated-type2.rs:7:1
|
||||||
|
|
|
|
||||||
LL | trait Baz: Foo + Bar<Self::Item> {}
|
LL | trait Baz: Foo + Bar<Self::Item> {}
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | pub trait Processor: Subscriber<Input = Self::Input> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: ...which immediately requires computing the super traits of `Processor` with associated type name `Input` again
|
= note: ...which immediately requires computing the super traits of `Processor` with associated type name `Input` again
|
||||||
note: cycle used when computing the super traits of `Processor`
|
note: cycle used when computing the super predicates of `Processor`
|
||||||
--> $DIR/issue-20825.rs:5:1
|
--> $DIR/issue-20825.rs:5:1
|
||||||
|
|
|
|
||||||
LL | pub trait Processor: Subscriber<Input = Self::Input> {
|
LL | pub trait Processor: Subscriber<Input = Self::Input> {
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
error[E0391]: cycle detected when computing the super predicates of `Chromosome`
|
error[E0391]: cycle detected when computing the super predicates of `Chromosome`
|
||||||
--> $DIR/cycle-trait-supertrait-direct.rs:3:1
|
|
||||||
|
|
|
||||||
LL | trait Chromosome: Chromosome {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires computing the super traits of `Chromosome`...
|
|
||||||
--> $DIR/cycle-trait-supertrait-direct.rs:3:19
|
--> $DIR/cycle-trait-supertrait-direct.rs:3:19
|
||||||
|
|
|
|
||||||
LL | trait Chromosome: Chromosome {
|
LL | trait Chromosome: Chromosome {
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
= note: ...which again requires computing the super predicates of `Chromosome`, completing the cycle
|
|
|
||||||
|
= note: ...which immediately requires computing the super predicates of `Chromosome` again
|
||||||
note: cycle used when collecting item types in top-level module
|
note: cycle used when collecting item types in top-level module
|
||||||
--> $DIR/cycle-trait-supertrait-direct.rs:3:1
|
--> $DIR/cycle-trait-supertrait-direct.rs:3:1
|
||||||
|
|
|
|
||||||
|
|
|
@ -1,26 +1,16 @@
|
||||||
error[E0391]: cycle detected when computing the super predicates of `B`
|
error[E0391]: cycle detected when computing the super predicates of `B`
|
||||||
--> $DIR/cycle-trait-supertrait-indirect.rs:7:1
|
|
||||||
|
|
|
||||||
LL | trait B: C {
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires computing the super traits of `B`...
|
|
||||||
--> $DIR/cycle-trait-supertrait-indirect.rs:7:10
|
--> $DIR/cycle-trait-supertrait-indirect.rs:7:10
|
||||||
|
|
|
|
||||||
LL | trait B: C {
|
LL | trait B: C {
|
||||||
| ^
|
| ^
|
||||||
note: ...which requires computing the super predicates of `C`...
|
|
||||||
--> $DIR/cycle-trait-supertrait-indirect.rs:11:1
|
|
||||||
|
|
|
|
||||||
LL | trait C: B { }
|
note: ...which requires computing the super predicates of `C`...
|
||||||
| ^^^^^^^^^^
|
|
||||||
note: ...which requires computing the super traits of `C`...
|
|
||||||
--> $DIR/cycle-trait-supertrait-indirect.rs:11:10
|
--> $DIR/cycle-trait-supertrait-indirect.rs:11:10
|
||||||
|
|
|
|
||||||
LL | trait C: B { }
|
LL | trait C: B { }
|
||||||
| ^
|
| ^
|
||||||
= note: ...which again requires computing the super predicates of `B`, completing the cycle
|
= note: ...which again requires computing the super predicates of `B`, completing the cycle
|
||||||
note: cycle used when computing the super traits of `A`
|
note: cycle used when computing the super predicates of `A`
|
||||||
--> $DIR/cycle-trait-supertrait-indirect.rs:4:10
|
--> $DIR/cycle-trait-supertrait-indirect.rs:4:10
|
||||||
|
|
|
|
||||||
LL | trait A: B {
|
LL | trait A: B {
|
||||||
|
|
|
@ -1,30 +1,15 @@
|
||||||
error[E0391]: cycle detected when computing the super predicates of `T1`
|
error[E0391]: cycle detected when computing the super predicates of `T1`
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:3:1
|
|
||||||
|
|
|
||||||
LL | trait T1 = T2;
|
|
||||||
| ^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires computing the super traits of `T1`...
|
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:3:12
|
--> $DIR/infinite-trait-alias-recursion.rs:3:12
|
||||||
|
|
|
|
||||||
LL | trait T1 = T2;
|
LL | trait T1 = T2;
|
||||||
| ^^
|
| ^^
|
||||||
note: ...which requires computing the super predicates of `T2`...
|
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:6:1
|
|
||||||
|
|
|
|
||||||
LL | trait T2 = T3;
|
note: ...which requires computing the super predicates of `T2`...
|
||||||
| ^^^^^^^^
|
|
||||||
note: ...which requires computing the super traits of `T2`...
|
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:6:12
|
--> $DIR/infinite-trait-alias-recursion.rs:6:12
|
||||||
|
|
|
|
||||||
LL | trait T2 = T3;
|
LL | trait T2 = T3;
|
||||||
| ^^
|
| ^^
|
||||||
note: ...which requires computing the super predicates of `T3`...
|
note: ...which requires computing the super predicates of `T3`...
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:8:1
|
|
||||||
|
|
|
||||||
LL | trait T3 = T1 + T3;
|
|
||||||
| ^^^^^^^^
|
|
||||||
note: ...which requires computing the super traits of `T3`...
|
|
||||||
--> $DIR/infinite-trait-alias-recursion.rs:8:12
|
--> $DIR/infinite-trait-alias-recursion.rs:8:12
|
||||||
|
|
|
|
||||||
LL | trait T3 = T1 + T3;
|
LL | trait T3 = T1 + T3;
|
||||||
|
|
|
@ -1,20 +1,10 @@
|
||||||
error[E0391]: cycle detected when computing the super predicates of `T1`
|
error[E0391]: cycle detected when computing the super predicates of `T1`
|
||||||
--> $DIR/issue-12511.rs:1:1
|
|
||||||
|
|
|
||||||
LL | trait T1 : T2 {
|
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires computing the super traits of `T1`...
|
|
||||||
--> $DIR/issue-12511.rs:1:12
|
--> $DIR/issue-12511.rs:1:12
|
||||||
|
|
|
|
||||||
LL | trait T1 : T2 {
|
LL | trait T1 : T2 {
|
||||||
| ^^
|
| ^^
|
||||||
note: ...which requires computing the super predicates of `T2`...
|
|
||||||
--> $DIR/issue-12511.rs:5:1
|
|
||||||
|
|
|
|
||||||
LL | trait T2 : T1 {
|
note: ...which requires computing the super predicates of `T2`...
|
||||||
| ^^^^^^^^^^^^^
|
|
||||||
note: ...which requires computing the super traits of `T2`...
|
|
||||||
--> $DIR/issue-12511.rs:5:12
|
--> $DIR/issue-12511.rs:5:12
|
||||||
|
|
|
|
||||||
LL | trait T2 : T1 {
|
LL | trait T2 : T1 {
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | trait T : Iterator<Item=Self::Item>
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: ...which immediately requires computing the super traits of `T` with associated type name `Item` again
|
= note: ...which immediately requires computing the super traits of `T` with associated type name `Item` again
|
||||||
note: cycle used when computing the super traits of `T`
|
note: cycle used when computing the super predicates of `T`
|
||||||
--> $DIR/issue-20772.rs:1:1
|
--> $DIR/issue-20772.rs:1:1
|
||||||
|
|
|
|
||||||
LL | trait T : Iterator<Item=Self::Item>
|
LL | trait T : Iterator<Item=Self::Item>
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
error[E0391]: cycle detected when computing the super predicates of `A`
|
error[E0391]: cycle detected when computing the super predicates of `A`
|
||||||
--> $DIR/cyclic-trait-resolution.rs:1:1
|
|
||||||
|
|
|
||||||
LL | trait A: B + A {}
|
|
||||||
| ^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
note: ...which requires computing the super traits of `A`...
|
|
||||||
--> $DIR/cyclic-trait-resolution.rs:1:14
|
--> $DIR/cyclic-trait-resolution.rs:1:14
|
||||||
|
|
|
|
||||||
LL | trait A: B + A {}
|
LL | trait A: B + A {}
|
||||||
| ^
|
| ^
|
||||||
= note: ...which again requires computing the super predicates of `A`, completing the cycle
|
|
|
||||||
|
= note: ...which immediately requires computing the super predicates of `A` again
|
||||||
note: cycle used when collecting item types in top-level module
|
note: cycle used when collecting item types in top-level module
|
||||||
--> $DIR/cyclic-trait-resolution.rs:1:1
|
--> $DIR/cyclic-trait-resolution.rs:1:1
|
||||||
|
|
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue