about summary refs log tree commit diff
path: root/compiler/rustc_trait_selection/src/traits
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-08-18 01:12:46 +0000
committerMichael Goulet <michael@errs.io>2022-08-18 01:12:46 +0000
commitc4a5b142113ce9d161fcb653fcb3ec11c45680bf (patch)
tree4dfa4998a3d252db7b324ce1ead1bf0b21068130 /compiler/rustc_trait_selection/src/traits
parent9c20b2a8cc7588decb6de25ac6a7912dcef24d65 (diff)
downloadrust-c4a5b142113ce9d161fcb653fcb3ec11c45680bf.tar.gz
rust-c4a5b142113ce9d161fcb653fcb3ec11c45680bf.zip
Avoid overflow in is_impossible_method
Diffstat (limited to 'compiler/rustc_trait_selection/src/traits')
-rw-r--r--compiler/rustc_trait_selection/src/traits/mod.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/mod.rs b/compiler/rustc_trait_selection/src/traits/mod.rs
index b6d6df1eec6..20e9cbaa38f 100644
--- a/compiler/rustc_trait_selection/src/traits/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/mod.rs
@@ -571,9 +571,16 @@ fn is_impossible_method<'tcx>(
     });
 
     tcx.infer_ctxt().ignoring_regions().enter(|ref infcx| {
-        let mut fulfill_ctxt = <dyn TraitEngine<'_>>::new(tcx);
-        fulfill_ctxt.register_predicate_obligations(infcx, predicates_for_trait);
-        !fulfill_ctxt.select_all_or_error(infcx).is_empty()
+        for obligation in predicates_for_trait {
+            // Ignore overflow error, to be conservative.
+            if let Ok(result) = infcx.evaluate_obligation(&obligation)
+                && !result.may_apply()
+            {
+                return true;
+            }
+        }
+
+        false
     })
 }