about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src/solve/delegate.rs
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2025-05-28 11:14:43 +0000
committerMichael Goulet <michael@errs.io>2025-06-02 19:23:20 +0000
commit3418d5db3aa619f19f59f4ee341f6683ed6743b4 (patch)
tree663c879c28f40614dad3738e30a3572208d47881 /compiler/rustc_trait_selection/src/solve/delegate.rs
parent2398bd60ef526e686a38a299cc2fa991d8b3c33e (diff)
downloadrust-3418d5db3aa619f19f59f4ee341f6683ed6743b4.tar.gz
rust-3418d5db3aa619f19f59f4ee341f6683ed6743b4.zip
Fast path for stalled obligations on self ty
Diffstat (limited to 'compiler/rustc_trait_selection/src/solve/delegate.rs')
-rw-r--r--compiler/rustc_trait_selection/src/solve/delegate.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/delegate.rs b/compiler/rustc_trait_selection/src/solve/delegate.rs
index e92e37b8738..406acdb7d88 100644
--- a/compiler/rustc_trait_selection/src/solve/delegate.rs
+++ b/compiler/rustc_trait_selection/src/solve/delegate.rs
@@ -64,6 +64,16 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
         span: Span,
     ) -> Option<Certainty> {
         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 {
                 match self.0.tcx.as_lang_item(trait_pred.def_id()) {
                     Some(LangItem::Sized)