Don't structurally resolve in may_coerce
This commit is contained in:
parent
b4e9aad137
commit
e3eba2d920
2 changed files with 16 additions and 14 deletions
|
@ -1091,16 +1091,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
///
|
///
|
||||||
/// This should only be used for diagnostics.
|
/// This should only be used for diagnostics.
|
||||||
pub(crate) fn may_coerce(&self, expr_ty: Ty<'tcx>, target_ty: Ty<'tcx>) -> bool {
|
pub(crate) fn may_coerce(&self, expr_ty: Ty<'tcx>, target_ty: Ty<'tcx>) -> bool {
|
||||||
// FIXME(-Znext-solver): We need to structurally resolve both types here.
|
|
||||||
let source = self.resolve_vars_with_obligations(expr_ty);
|
|
||||||
debug!("coercion::can_with_predicates({:?} -> {:?})", source, target_ty);
|
|
||||||
|
|
||||||
let cause = self.cause(DUMMY_SP, ObligationCauseCode::ExprAssignable);
|
let cause = self.cause(DUMMY_SP, ObligationCauseCode::ExprAssignable);
|
||||||
// We don't ever need two-phase here since we throw out the result of the coercion.
|
// We don't ever need two-phase here since we throw out the result of the coercion.
|
||||||
// We also just always set `coerce_never` to true, since this is a heuristic.
|
// We also just always set `coerce_never` to true, since this is a heuristic.
|
||||||
let coerce = Coerce::new(self, cause, AllowTwoPhase::No, true);
|
let coerce = Coerce::new(self, cause, AllowTwoPhase::No, true);
|
||||||
self.probe(|_| {
|
self.probe(|_| {
|
||||||
let Ok(ok) = coerce.coerce(source, target_ty) else {
|
let Ok(ok) = coerce.coerce(expr_ty, target_ty) else {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
let ocx = ObligationCtxt::new(self);
|
let ocx = ObligationCtxt::new(self);
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/lazy_subtyping_of_opaques.rs:11:5
|
||||||
|
|
|
||||||
|
LL | fn reify_as_tait() -> Thunk<Tait> {
|
||||||
|
| ----------- expected `Thunk<_>` because of return type
|
||||||
|
LL |
|
||||||
|
LL | Thunk::new(|cont| cont)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ expected `Thunk<_>`, found `()`
|
||||||
|
|
|
||||||
|
= note: expected struct `Thunk<_>`
|
||||||
|
found unit type `()`
|
||||||
|
|
||||||
error[E0277]: expected a `FnOnce()` closure, found `()`
|
error[E0277]: expected a `FnOnce()` closure, found `()`
|
||||||
--> $DIR/lazy_subtyping_of_opaques.rs:11:23
|
--> $DIR/lazy_subtyping_of_opaques.rs:11:23
|
||||||
|
|
|
|
||||||
|
@ -12,19 +24,13 @@ error[E0277]: expected a `FnOnce()` closure, found `()`
|
||||||
|
|
|
|
||||||
LL | fn reify_as_tait() -> Thunk<Tait> {
|
LL | fn reify_as_tait() -> Thunk<Tait> {
|
||||||
| ^^^^^^^^^^^ expected an `FnOnce()` closure, found `()`
|
| ^^^^^^^^^^^ expected an `FnOnce()` closure, found `()`
|
||||||
|
LL |
|
||||||
|
LL | Thunk::new(|cont| cont)
|
||||||
|
| ----------------------- return type was inferred to be `{type error}` here
|
||||||
|
|
|
|
||||||
= help: the trait `FnOnce()` is not implemented for `()`
|
= help: the trait `FnOnce()` is not implemented for `()`
|
||||||
= note: wrap the `()` in a closure with no arguments: `|| { /* code */ }`
|
= note: wrap the `()` in a closure with no arguments: `|| { /* code */ }`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
|
||||||
--> $DIR/lazy_subtyping_of_opaques.rs:11:5
|
|
||||||
|
|
|
||||||
LL | Thunk::new(|cont| cont)
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ expected `Thunk<_>`, found `()`
|
|
||||||
|
|
|
||||||
= note: expected struct `Thunk<_>`
|
|
||||||
found unit type `()`
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0277, E0308.
|
Some errors have detailed explanations: E0277, E0308.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue