diff options
| author | Michael Goulet <michael@errs.io> | 2024-02-20 02:13:28 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-02-20 02:16:36 +0000 |
| commit | 994d55158dcfe0b1b299591bb552af14c63c6e60 (patch) | |
| tree | 44ad44a7f03dc1781d4dc0cf5d9defb45aa6e0f6 | |
| parent | 0395fa387ad4de63ea1b36703ca0d65017b8c2dc (diff) | |
| download | rust-994d55158dcfe0b1b299591bb552af14c63c6e60.tar.gz rust-994d55158dcfe0b1b299591bb552af14c63c6e60.zip | |
Simply do not ICE
3 files changed, 30 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/fulfill.rs b/compiler/rustc_trait_selection/src/solve/fulfill.rs index 63555a305d8..97f715b6386 100644 --- a/compiler/rustc_trait_selection/src/solve/fulfill.rs +++ b/compiler/rustc_trait_selection/src/solve/fulfill.rs @@ -109,7 +109,10 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> { let mut errors = Vec::new(); for i in 0.. { if !infcx.tcx.recursion_limit().value_within_limit(i) { - unimplemented!("overflowed on pending obligations: {:?}", self.obligations); + // Only return true errors that we have accumulated while processing; + // keep ambiguities around, *including overflows*, because they shouldn't + // be considered true errors. + return errors; } let mut has_changed = false; diff --git a/tests/ui/traits/next-solver/coherence-fulfill-overflow.rs b/tests/ui/traits/next-solver/coherence-fulfill-overflow.rs new file mode 100644 index 00000000000..ff577da32c2 --- /dev/null +++ b/tests/ui/traits/next-solver/coherence-fulfill-overflow.rs @@ -0,0 +1,15 @@ +//@ compile-flags: -Znext-solver=coherence + +#![recursion_limit = "10"] + +trait Trait {} + +struct W<T: ?Sized>(*const T); +trait TwoW {} +impl<T: ?Sized + TwoW> TwoW for W<W<T>> {} + +impl<T: ?Sized + TwoW> Trait for W<T> {} +impl<T: ?Sized + TwoW> Trait for T {} +//~^ ERROR conflicting implementations of trait `Trait` for type `W + +fn main() {} diff --git a/tests/ui/traits/next-solver/coherence-fulfill-overflow.stderr b/tests/ui/traits/next-solver/coherence-fulfill-overflow.stderr new file mode 100644 index 00000000000..406c0ccca97 --- /dev/null +++ b/tests/ui/traits/next-solver/coherence-fulfill-overflow.stderr @@ -0,0 +1,11 @@ +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<_>>>>>>>>>>>>>>>>>>>>>` + --> $DIR/coherence-fulfill-overflow.rs:12:1 + | +LL | impl<T: ?Sized + TwoW> Trait for W<T> {} + | ------------------------------------- first implementation here +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<_>>>>>>>>>>>>>>>>>>>>>` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0119`. |
