Fast path for stalled obligations on self ty
This commit is contained in:
@@ -53,7 +53,7 @@ impl<'tcx> OpaqueTypeStorage<'tcx> {
|
|||||||
assert!(entry.is_some());
|
assert!(entry.is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
let OpaqueTypeStorage { opaque_types, duplicate_entries } = self;
|
let OpaqueTypeStorage { opaque_types, duplicate_entries } = self;
|
||||||
opaque_types.is_empty() && duplicate_entries.is_empty()
|
opaque_types.is_empty() && duplicate_entries.is_empty()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,16 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
|
|||||||
span: Span,
|
span: Span,
|
||||||
) -> Option<Certainty> {
|
) -> Option<Certainty> {
|
||||||
if let Some(trait_pred) = goal.predicate.as_trait_clause() {
|
if let Some(trait_pred) = goal.predicate.as_trait_clause() {
|
||||||
|
if self.shallow_resolve(trait_pred.self_ty().skip_binder()).is_ty_var()
|
||||||
|
// We don't do this fast path when opaques are defined since we may
|
||||||
|
// eventually use opaques to incompletely guide inference via ty var
|
||||||
|
// self types.
|
||||||
|
// FIXME: Properly consider opaques here.
|
||||||
|
&& self.inner.borrow_mut().opaque_types().is_empty()
|
||||||
|
{
|
||||||
|
return Some(Certainty::AMBIGUOUS);
|
||||||
|
}
|
||||||
|
|
||||||
if trait_pred.polarity() == ty::PredicatePolarity::Positive {
|
if trait_pred.polarity() == ty::PredicatePolarity::Positive {
|
||||||
match self.0.tcx.as_lang_item(trait_pred.def_id()) {
|
match self.0.tcx.as_lang_item(trait_pred.def_id()) {
|
||||||
Some(LangItem::Sized)
|
Some(LangItem::Sized)
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
error[E0119]: conflicting implementations of trait `Trait` for type `W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<_>>>>>>>>>>>>>>>>>>>>>`
|
error[E0119]: conflicting implementations of trait `Trait` for type `W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<_>>>>>>>>>>>>>>>>>>>>>>>`
|
||||||
--> $DIR/coherence-fulfill-overflow.rs:12:1
|
--> $DIR/coherence-fulfill-overflow.rs:12:1
|
||||||
|
|
|
|
||||||
LL | impl<T: ?Sized + TwoW> Trait for W<T> {}
|
LL | impl<T: ?Sized + TwoW> Trait for W<T> {}
|
||||||
| ------------------------------------- first implementation here
|
| ------------------------------------- first implementation here
|
||||||
LL | impl<T: ?Sized + TwoW> Trait for T {}
|
LL | impl<T: ?Sized + TwoW> Trait for T {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<_>>>>>>>>>>>>>>>>>>>>>`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<_>>>>>>>>>>>>>>>>>>>>>>>`
|
||||||
|
|
|
||||||
= note: overflow evaluating the requirement `W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<W<_>>>>>>>>>>>>>>>>>>>>>: TwoW`
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "20"]` attribute to your crate (`coherence_fulfill_overflow`)
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user