bivariant alias: set has_unconstrained_ty_var
This commit is contained in:
parent
a330e49593
commit
a8e091de4a
@ -329,6 +329,14 @@ fn cyclic_term_error(&self) -> TypeError<'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new type variable in the universe of the target when
|
||||||
|
/// generalizing an alias. This has to set `has_unconstrained_ty_var`
|
||||||
|
/// if we're currently in a bivariant context.
|
||||||
|
fn next_ty_var_for_alias(&mut self) -> Ty<'tcx> {
|
||||||
|
self.has_unconstrained_ty_var |= self.ambient_variance == ty::Bivariant;
|
||||||
|
self.infcx.next_ty_var_in_universe(self.span, self.for_universe)
|
||||||
|
}
|
||||||
|
|
||||||
/// An occurs check failure inside of an alias does not mean
|
/// An occurs check failure inside of an alias does not mean
|
||||||
/// that the types definitely don't unify. We may be able
|
/// that the types definitely don't unify. We may be able
|
||||||
/// to normalize the alias after all.
|
/// to normalize the alias after all.
|
||||||
@ -358,7 +366,7 @@ fn generalize_alias_ty(
|
|||||||
//
|
//
|
||||||
// cc trait-system-refactor-initiative#110
|
// cc trait-system-refactor-initiative#110
|
||||||
if self.infcx.next_trait_solver() && !alias.has_escaping_bound_vars() && !self.in_alias {
|
if self.infcx.next_trait_solver() && !alias.has_escaping_bound_vars() && !self.in_alias {
|
||||||
return Ok(self.infcx.next_ty_var_in_universe(self.span, self.for_universe));
|
return Ok(self.next_ty_var_for_alias());
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_nested_alias = mem::replace(&mut self.in_alias, true);
|
let is_nested_alias = mem::replace(&mut self.in_alias, true);
|
||||||
@ -378,7 +386,7 @@ fn generalize_alias_ty(
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug!("generalization failure in alias");
|
debug!("generalization failure in alias");
|
||||||
Ok(self.infcx.next_ty_var_in_universe(self.span, self.for_universe))
|
Ok(self.next_ty_var_for_alias())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
20
tests/ui/traits/next-solver/generalize/bivariant-alias.rs
Normal file
20
tests/ui/traits/next-solver/generalize/bivariant-alias.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//@ revisions: old next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
// When generalizing an alias in a bivariant context, we have to set
|
||||||
|
// `has_unconstrained_ty_var` as we may otherwise never check for
|
||||||
|
// well-formedness of the generalized type, causing us to error due
|
||||||
|
// to ambiguity.
|
||||||
|
trait Trait {
|
||||||
|
type Assoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct BivariantArg<I, T: Trait<Assoc = I>>(T);
|
||||||
|
|
||||||
|
fn generalize<T: Trait>(input: BivariantArg<T::Assoc, T>) {
|
||||||
|
let _generalized = input;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {}
|
Loading…
Reference in New Issue
Block a user