diff options
| author | Michael Goulet <michael@errs.io> | 2025-05-17 12:01:13 +0000 | 
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-05-17 12:09:15 +0000 | 
| commit | 9578b59eacbdf73d577b70439d580ac3522856db (patch) | |
| tree | 73acd0273fa30290fa57b4b02c6ca0d25197d6e0 /compiler/rustc_trait_selection/src/traits/mod.rs | |
| parent | 36ad75bcebece482b9980c72541469a4a8af9dbb (diff) | |
| download | rust-9578b59eacbdf73d577b70439d580ac3522856db.tar.gz rust-9578b59eacbdf73d577b70439d580ac3522856db.zip | |
Only select true errors in impossible_predicates
Diffstat (limited to 'compiler/rustc_trait_selection/src/traits/mod.rs')
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/mod.rs | 10 | 
1 files changed, 8 insertions, 2 deletions
| diff --git a/compiler/rustc_trait_selection/src/traits/mod.rs b/compiler/rustc_trait_selection/src/traits/mod.rs index 4738a538b29..31b075db04b 100644 --- a/compiler/rustc_trait_selection/src/traits/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/mod.rs @@ -701,9 +701,15 @@ pub fn impossible_predicates<'tcx>(tcx: TyCtxt<'tcx>, predicates: Vec<ty::Clause let obligation = Obligation::new(tcx, ObligationCause::dummy(), param_env, predicate); ocx.register_obligation(obligation); } - let errors = ocx.select_all_or_error(); - if !errors.is_empty() { + // Use `select_where_possible` to only return impossible for true errors, + // and not ambiguities or overflows. Since the new trait solver forces + // some currently undetected overlap between `dyn Trait: Trait` built-in + // vs user-written impls to AMBIGUOUS, this may return ambiguity even + // with no infer vars. There may also be ways to encounter ambiguity due + // to post-mono overflow. + let true_errors = ocx.select_where_possible(); + if !true_errors.is_empty() { return true; } | 
