Rollup merge of #88757 - andrewhickman:master, r=jackh726
Suggest wapping expr in parentheses on invalid unary negation Fixes #88701
This commit is contained in:
commit
08cbb7dbe1
4 changed files with 79 additions and 36 deletions
|
@ -680,42 +680,53 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
ex.span,
|
ex.span,
|
||||||
format!("cannot apply unary operator `{}`", op.as_str()),
|
format!("cannot apply unary operator `{}`", op.as_str()),
|
||||||
);
|
);
|
||||||
match actual.kind() {
|
|
||||||
Uint(_) if op == hir::UnOp::Neg => {
|
|
||||||
err.note("unsigned values cannot be negated");
|
|
||||||
|
|
||||||
if let hir::ExprKind::Unary(
|
let sp = self.tcx.sess.source_map().start_point(ex.span);
|
||||||
_,
|
if let Some(sp) =
|
||||||
hir::Expr {
|
self.tcx.sess.parse_sess.ambiguous_block_expr_parse.borrow().get(&sp)
|
||||||
kind:
|
{
|
||||||
hir::ExprKind::Lit(Spanned {
|
// If the previous expression was a block expression, suggest parentheses
|
||||||
node: ast::LitKind::Int(1, _),
|
// (turning this into a binary subtraction operation instead.)
|
||||||
..
|
// for example, `{2} - 2` -> `({2}) - 2` (see src\test\ui\parser\expr-as-stmt.rs)
|
||||||
}),
|
self.tcx.sess.parse_sess.expr_parentheses_needed(&mut err, *sp);
|
||||||
..
|
} else {
|
||||||
},
|
match actual.kind() {
|
||||||
) = ex.kind
|
Uint(_) if op == hir::UnOp::Neg => {
|
||||||
{
|
err.note("unsigned values cannot be negated");
|
||||||
err.span_suggestion(
|
|
||||||
ex.span,
|
if let hir::ExprKind::Unary(
|
||||||
&format!(
|
_,
|
||||||
"you may have meant the maximum value of `{}`",
|
hir::Expr {
|
||||||
actual
|
kind:
|
||||||
),
|
hir::ExprKind::Lit(Spanned {
|
||||||
format!("{}::MAX", actual),
|
node: ast::LitKind::Int(1, _),
|
||||||
Applicability::MaybeIncorrect,
|
..
|
||||||
);
|
}),
|
||||||
|
..
|
||||||
|
},
|
||||||
|
) = ex.kind
|
||||||
|
{
|
||||||
|
err.span_suggestion(
|
||||||
|
ex.span,
|
||||||
|
&format!(
|
||||||
|
"you may have meant the maximum value of `{}`",
|
||||||
|
actual
|
||||||
|
),
|
||||||
|
format!("{}::MAX", actual),
|
||||||
|
Applicability::MaybeIncorrect,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Str | Never | Char | Tuple(_) | Array(_, _) => {}
|
||||||
|
Ref(_, ref lty, _) if *lty.kind() == Str => {}
|
||||||
|
_ => {
|
||||||
|
let missing_trait = match op {
|
||||||
|
hir::UnOp::Neg => "std::ops::Neg",
|
||||||
|
hir::UnOp::Not => "std::ops::Not",
|
||||||
|
hir::UnOp::Deref => "std::ops::UnDerf",
|
||||||
|
};
|
||||||
|
suggest_impl_missing(&mut err, operand_ty, &missing_trait);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Str | Never | Char | Tuple(_) | Array(_, _) => {}
|
|
||||||
Ref(_, ref lty, _) if *lty.kind() == Str => {}
|
|
||||||
_ => {
|
|
||||||
let missing_trait = match op {
|
|
||||||
hir::UnOp::Neg => "std::ops::Neg",
|
|
||||||
hir::UnOp::Not => "std::ops::Not",
|
|
||||||
hir::UnOp::Deref => "std::ops::UnDerf",
|
|
||||||
};
|
|
||||||
suggest_impl_missing(&mut err, operand_ty, &missing_trait);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err.emit();
|
err.emit();
|
||||||
|
|
|
@ -32,4 +32,9 @@ fn moo(x: u32) -> bool {
|
||||||
}) > 0 //~ ERROR expected expression
|
}) > 0 //~ ERROR expected expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn qux() -> u32 {
|
||||||
|
({2}) - 2 //~ ERROR cannot apply unary operator `-` to type `u32`
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -32,4 +32,9 @@ fn moo(x: u32) -> bool {
|
||||||
} > 0 //~ ERROR expected expression
|
} > 0 //~ ERROR expected expression
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn qux() -> u32 {
|
||||||
|
{2} - 2 //~ ERROR cannot apply unary operator `-` to type `u32`
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -99,7 +99,29 @@ help: parentheses are required to parse this as an expression
|
||||||
LL | ({ 3 }) * 3
|
LL | ({ 3 }) * 3
|
||||||
| + +
|
| + +
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/expr-as-stmt.rs:36:6
|
||||||
|
|
|
||||||
|
LL | {2} - 2
|
||||||
|
| ^ expected `()`, found integer
|
||||||
|
|
|
||||||
|
help: you might have meant to return this value
|
||||||
|
|
|
||||||
|
LL | {return 2;} - 2
|
||||||
|
| ++++++ +
|
||||||
|
|
||||||
Some errors have detailed explanations: E0308, E0614.
|
error[E0600]: cannot apply unary operator `-` to type `u32`
|
||||||
|
--> $DIR/expr-as-stmt.rs:36:9
|
||||||
|
|
|
||||||
|
LL | {2} - 2
|
||||||
|
| ^^^ cannot apply unary operator `-`
|
||||||
|
|
|
||||||
|
help: parentheses are required to parse this as an expression
|
||||||
|
|
|
||||||
|
LL | ({2}) - 2
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: aborting due to 11 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0308, E0600, E0614.
|
||||||
For more information about an error, try `rustc --explain E0308`.
|
For more information about an error, try `rustc --explain E0308`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue