fix: use ExprIsRead::Yes for rhs of ordinary assignments
the rhs of an ordinary assignment `x = *never_ptr` was inferred with `ExprIsRead::No`, which prevented `NeverToAny` coercion for place expressions of type `!`. this caused false type mismatches and missing divergence detection. the destructuring assignment path and let binding path both correctly use `ExprIsRead::Yes` for the rhs value, since the value is always consumed (read). this makes the ordinary assignment path consistent with both.
This commit is contained in:
parent
646418838f
commit
7733f65ff9
2 changed files with 17 additions and 1 deletions
|
|
@ -751,7 +751,7 @@ impl<'db> InferenceContext<'_, 'db> {
|
|||
|
||||
if let Some(lhs_ty) = lhs_ty {
|
||||
self.write_pat_ty(target, lhs_ty);
|
||||
self.infer_expr_coerce(value, &Expectation::has_type(lhs_ty), ExprIsRead::No);
|
||||
self.infer_expr_coerce(value, &Expectation::has_type(lhs_ty), ExprIsRead::Yes);
|
||||
} else {
|
||||
let rhs_ty = self.infer_expr(value, &Expectation::none(), ExprIsRead::Yes);
|
||||
let resolver_guard =
|
||||
|
|
|
|||
|
|
@ -786,6 +786,22 @@ fn coerce_ref_mut_binding() -> ! {
|
|||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn assign_never_place_no_mismatch() {
|
||||
check_no_mismatches(
|
||||
r#"
|
||||
//- minicore: sized
|
||||
fn foo() {
|
||||
unsafe {
|
||||
let p: *mut ! = 0 as _;
|
||||
let mut x: () = ();
|
||||
x = *p;
|
||||
}
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn never_place_isnt_diverging() {
|
||||
check_infer_with_mismatches(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue