9973: Handle coercion on binary operator RHS r=flodiebold a=lnicola

Closes #9968
CC #8961

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2021-08-21 16:10:04 +00:00 committed by GitHub
commit 337ccc75a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 1 deletions

View File

@ -679,7 +679,8 @@ impl<'a> InferenceContext<'a> {
let lhs_ty = self.infer_expr(*lhs, &lhs_expectation);
let lhs_ty = self.resolve_ty_shallow(&lhs_ty);
let rhs_expectation = op::binary_op_rhs_expectation(*op, lhs_ty.clone());
let rhs_ty = self.infer_expr(*rhs, &Expectation::has_type(rhs_expectation));
let rhs_ty =
self.infer_expr_coerce(*rhs, &Expectation::has_type(rhs_expectation));
let rhs_ty = self.resolve_ty_shallow(&rhs_ty);
let ret = op::binary_op_return_ty(*op, lhs_ty.clone(), rhs_ty.clone());

View File

@ -257,6 +257,24 @@ fn foo() {
);
}
#[test]
fn assign_coerce() {
check_no_mismatches(
r"
//- minicore: deref
struct String;
impl core::ops::Deref for String { type Target = str; }
fn g(_text: &str) {}
fn f(text: &str) {
let mut text = text;
let tmp = String;
text = &tmp;
g(text);
}
",
);
}
#[test]
fn coerce_fn_item_to_fn_ptr() {
check_no_mismatches(