shallow resolve target type in coercion
We used to avoid doing this because we didn't want to make coercion depend on the state of inference. For better or worse, we have moved away from this position over time. Therefore, I am going to go ahead and resolve the `b` target type early on so that it is done uniformly. (The older technique for managing this was always something of a hack regardless; if we really wanted to avoid integrating coercion and inference we needed to be more disciplined about it.)
This commit is contained in:
parent
7e0ae7d89b
commit
5eca626e40
@ -147,6 +147,7 @@ fn unify_and<F>(&self, a: Ty<'tcx>, b: Ty<'tcx>, f: F) -> CoerceResult<'tcx>
|
||||
|
||||
fn coerce(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> {
|
||||
let a = self.shallow_resolve(a);
|
||||
let b = self.shallow_resolve(b);
|
||||
debug!("Coerce.tys({:?} => {:?})", a, b);
|
||||
|
||||
// Just ignore error types.
|
||||
@ -162,8 +163,7 @@ fn coerce(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> {
|
||||
// let _: Option<?T> = Some({ return; });
|
||||
//
|
||||
// here, we would coerce from `!` to `?T`.
|
||||
let b = self.shallow_resolve(b);
|
||||
return if self.shallow_resolve(b).is_ty_var() {
|
||||
return if b.is_ty_var() {
|
||||
// Micro-optimization: no need for this if `b` is
|
||||
// already resolved in some way.
|
||||
let diverging_ty = self.next_diverging_ty_var(TypeVariableOrigin {
|
||||
@ -196,9 +196,6 @@ fn coerce(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> {
|
||||
debug!("coerce: unsize failed");
|
||||
|
||||
// Examine the supertype and consider auto-borrowing.
|
||||
//
|
||||
// Note: does not attempt to resolve type variables we encounter.
|
||||
// See above for details.
|
||||
match *b.kind() {
|
||||
ty::RawPtr(mt_b) => {
|
||||
return self.coerce_unsafe_ptr(a, b, mt_b.mutbl);
|
||||
|
Loading…
Reference in New Issue
Block a user