mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Uniquify ReError on input mode in canonicalizer
This commit is contained in:
parent
1447f9d38c
commit
1fcf2eaa9f
@ -239,7 +239,7 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
|
|||||||
// FIXME: We should investigate the perf implications of not uniquifying
|
// FIXME: We should investigate the perf implications of not uniquifying
|
||||||
// `ReErased`. We may be able to short-circuit registering region
|
// `ReErased`. We may be able to short-circuit registering region
|
||||||
// obligations if we encounter a `ReErased` on one side, for example.
|
// obligations if we encounter a `ReErased` on one side, for example.
|
||||||
ty::ReStatic | ty::ReErased => match self.canonicalize_mode {
|
ty::ReStatic | ty::ReErased | ty::ReError(_) => match self.canonicalize_mode {
|
||||||
CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT),
|
CanonicalizeMode::Input => CanonicalVarKind::Region(ty::UniverseIndex::ROOT),
|
||||||
CanonicalizeMode::Response { .. } => return r,
|
CanonicalizeMode::Response { .. } => return r,
|
||||||
},
|
},
|
||||||
@ -277,7 +277,6 @@ impl<Infcx: InferCtxtLike<Interner = I>, I: Interner> TypeFolder<I>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::ReError(_) => return r,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let existing_bound_var = match self.canonicalize_mode {
|
let existing_bound_var = match self.canonicalize_mode {
|
||||||
|
28
tests/ui/traits/next-solver/dont-canonicalize-re-error.rs
Normal file
28
tests/ui/traits/next-solver/dont-canonicalize-re-error.rs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
//@ compile-flags: -Znext-solver
|
||||||
|
|
||||||
|
trait Tr<'a> {}
|
||||||
|
|
||||||
|
// Fulfillment in the new solver relies on an invariant to hold: Either
|
||||||
|
// `has_changed` is true, or computing a goal's certainty is idempotent.
|
||||||
|
// This isn't true for `ReError`, which we used to pass through in the
|
||||||
|
// canonicalizer even on input mode, which can cause a goal to go from
|
||||||
|
// ambig => pass, but we don't consider `has_changed` when the response
|
||||||
|
// only contains region constraints (since we usually uniquify regions).
|
||||||
|
//
|
||||||
|
// In this test:
|
||||||
|
// Implicit negative coherence tries to prove `W<?0>: Constrain<'?1>`,
|
||||||
|
// which will then match with the impl below. This constrains `'?1` to
|
||||||
|
// `ReError`, but still bails w/ ambiguity bc we can't prove `?0: Sized`.
|
||||||
|
// Then, when we recompute the goal `W<?0>: Constrain<'error>`, when
|
||||||
|
// collecting ambiguities and overflows, we end up assembling a default
|
||||||
|
// error candidate w/o ambiguity, which causes the goal to pass, and ICE.
|
||||||
|
impl<'a, A: ?Sized> Tr<'a> for W<A> {}
|
||||||
|
struct W<A: ?Sized>(A);
|
||||||
|
impl<'a, A: ?Sized> Tr<'a> for A where A: Constrain<'a> {}
|
||||||
|
//~^ ERROR conflicting implementations of trait `Tr<'_>` for type `W<_>`
|
||||||
|
|
||||||
|
trait Constrain<'a> {}
|
||||||
|
impl<A: Sized> Constrain<'missing> for W<A> {}
|
||||||
|
//~^ ERROR use of undeclared lifetime name `'missing`
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,21 @@
|
|||||||
|
error[E0261]: use of undeclared lifetime name `'missing`
|
||||||
|
--> $DIR/dont-canonicalize-re-error.rs:25:26
|
||||||
|
|
|
||||||
|
LL | impl<A: Sized> Constrain<'missing> for W<A> {}
|
||||||
|
| - ^^^^^^^^ undeclared lifetime
|
||||||
|
| |
|
||||||
|
| help: consider introducing lifetime `'missing` here: `'missing,`
|
||||||
|
|
||||||
|
error[E0119]: conflicting implementations of trait `Tr<'_>` for type `W<_>`
|
||||||
|
--> $DIR/dont-canonicalize-re-error.rs:21:1
|
||||||
|
|
|
||||||
|
LL | impl<'a, A: ?Sized> Tr<'a> for W<A> {}
|
||||||
|
| ----------------------------------- first implementation here
|
||||||
|
LL | struct W<A: ?Sized>(A);
|
||||||
|
LL | impl<'a, A: ?Sized> Tr<'a> for A where A: Constrain<'a> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `W<_>`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0119, E0261.
|
||||||
|
For more information about an error, try `rustc --explain E0119`.
|
Loading…
Reference in New Issue
Block a user