Rollup merge of #81325 - osa1:issue81293, r=estebank

typeck: Don't suggest converting LHS exprs

Converting LHS of an assignment does not work, so avoid suggesting that.

Fixes #81293
This commit is contained in:
Yuki Okushi 2021-01-27 04:43:24 +09:00 committed by GitHub
commit 71f13fb434
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 0 deletions

View File

@ -566,6 +566,17 @@ impl<'hir> Map<'hir> {
) )
} }
/// Checks if the node is left-hand side of an assignment.
pub fn is_lhs(&self, id: HirId) -> bool {
match self.find(self.get_parent_node(id)) {
Some(Node::Expr(expr)) => match expr.kind {
ExprKind::Assign(lhs, _rhs, _span) => lhs.hir_id == id,
_ => false,
},
_ => false,
}
}
/// Whether the expression pointed at by `hir_id` belongs to a `const` evaluation context. /// Whether the expression pointed at by `hir_id` belongs to a `const` evaluation context.
/// Used exclusively for diagnostics, to avoid suggestion function calls. /// Used exclusively for diagnostics, to avoid suggestion function calls.
pub fn is_inside_const_context(&self, hir_id: HirId) -> bool { pub fn is_inside_const_context(&self, hir_id: HirId) -> bool {

View File

@ -816,6 +816,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|err: &mut DiagnosticBuilder<'_>, |err: &mut DiagnosticBuilder<'_>,
found_to_exp_is_fallible: bool, found_to_exp_is_fallible: bool,
exp_to_found_is_fallible: bool| { exp_to_found_is_fallible: bool| {
let exp_is_lhs =
expected_ty_expr.map(|e| self.tcx.hir().is_lhs(e.hir_id)).unwrap_or(false);
if exp_is_lhs {
return;
}
let always_fallible = found_to_exp_is_fallible let always_fallible = found_to_exp_is_fallible
&& (exp_to_found_is_fallible || expected_ty_expr.is_none()); && (exp_to_found_is_fallible || expected_ty_expr.is_none());
let msg = if literal_is_ty_suffixed(expr) { let msg = if literal_is_ty_suffixed(expr) {

View File

@ -0,0 +1,9 @@
fn main() {
let a: u16;
let b: u16 = 42;
let c: usize = 5;
a = c + b * 5; //~ ERROR: mismatched types [E0308]
//~| ERROR: mismatched types [E0308]
//~| ERROR: cannot add `u16` to `usize` [E0277]
}

View File

@ -0,0 +1,24 @@
error[E0308]: mismatched types
--> $DIR/issue-81293.rs:6:13
|
LL | a = c + b * 5;
| ^^^^^ expected `usize`, found `u16`
error[E0308]: mismatched types
--> $DIR/issue-81293.rs:6:9
|
LL | a = c + b * 5;
| ^^^^^^^^^ expected `u16`, found `usize`
error[E0277]: cannot add `u16` to `usize`
--> $DIR/issue-81293.rs:6:11
|
LL | a = c + b * 5;
| ^ no implementation for `usize + u16`
|
= help: the trait `Add<u16>` is not implemented for `usize`
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.