Consider a goal as NOT changed if its response is identity modulo regions
This commit is contained in:
parent
99f60ec411
commit
1ffc6ca9a5
3 changed files with 34 additions and 2 deletions
|
@ -344,7 +344,7 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
|
|||
Ok(response) => response,
|
||||
};
|
||||
|
||||
let has_changed = !canonical_response.value.var_values.is_identity()
|
||||
let has_changed = !canonical_response.value.var_values.is_identity_modulo_regions()
|
||||
|| !canonical_response.value.external_constraints.opaque_types.is_empty();
|
||||
let (certainty, nested_goals) = match self.instantiate_and_apply_query_response(
|
||||
goal.param_env,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// revisions: current next
|
||||
//[next] compile-flag: -Ztrait-solver=next
|
||||
//[next] compile-flags: -Ztrait-solver=next
|
||||
// check-pass
|
||||
|
||||
use std::path::Path;
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
// compile-flags: -Ztrait-solver=next
|
||||
// check-pass
|
||||
|
||||
trait Eq<'a, 'b, T> {}
|
||||
|
||||
trait Ambig {}
|
||||
impl Ambig for () {}
|
||||
|
||||
impl<'a, T> Eq<'a, 'a, T> for () where T: Ambig {}
|
||||
|
||||
fn eq<'a, 'b, T>(t: T)
|
||||
where
|
||||
(): Eq<'a, 'b, T>,
|
||||
{
|
||||
}
|
||||
|
||||
fn test<'r>() {
|
||||
let mut x = Default::default();
|
||||
|
||||
// When we evaluate `(): Eq<'r, 'r, ?0>` we uniquify the regions.
|
||||
// That leads us to evaluate `(): Eq<'?0, '?1, ?0>`. The response of this
|
||||
// will be ambiguous (because `?0: Ambig` is ambig) and also not an "identity"
|
||||
// response, since the region constraints will contain `'?0 == '?1` (so
|
||||
// `is_changed` will return true). Since it's both ambig and changed,
|
||||
// fulfillment will both re-register the goal AND loop again. This hits the
|
||||
// overflow limit. This should neither be considered overflow, nor ICE.
|
||||
eq::<'r, 'r, _>(x);
|
||||
|
||||
x = ();
|
||||
}
|
||||
|
||||
fn main() {}
|
Loading…
Add table
Reference in a new issue