fix invalid code suggestion in manual_unwrap_or, due to macro expansion

This commit is contained in:
Mateusz Gacek 2021-04-26 12:08:24 -07:00
parent a362a4d1d0
commit 84003aa7a1
4 changed files with 48 additions and 2 deletions

View file

@ -112,6 +112,15 @@ fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
then {
let reindented_or_body =
reindent_multiline(or_body_snippet.into(), true, Some(indent));
let suggestion = if scrutinee.span.from_expansion() {
// we don't want parenthesis around macro, e.g. `(some_macro!()).unwrap_or(0)`
sugg::Sugg::hir_with_macro_callsite(cx, scrutinee, "..")
}
else {
sugg::Sugg::hir(cx, scrutinee, "..").maybe_par()
};
span_lint_and_sugg(
cx,
MANUAL_UNWRAP_OR, expr.span,
@ -119,7 +128,7 @@ fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
"replace with",
format!(
"{}.unwrap_or({})",
sugg::Sugg::hir(cx, scrutinee, "..").maybe_par(),
suggestion,
reindented_or_body,
),
Applicability::MachineApplicable,

View file

@ -151,4 +151,16 @@ const fn const_fn_result_unwrap_or() {
};
}
mod issue6965 {
macro_rules! some_macro {
() => {
if 1 > 2 { Some(1) } else { None }
};
}
fn test() {
let _ = some_macro!().unwrap_or(0);
}
}
fn main() {}

View file

@ -190,4 +190,19 @@ const fn const_fn_result_unwrap_or() {
};
}
mod issue6965 {
macro_rules! some_macro {
() => {
if 1 > 2 { Some(1) } else { None }
};
}
fn test() {
let _ = match some_macro!() {
Some(val) => val,
None => 0,
};
}
}
fn main() {}

View file

@ -141,5 +141,15 @@ LL | | Err(_) => "Alice",
LL | | };
| |_____^ help: replace with: `Ok::<&str, &str>("Bob").unwrap_or("Alice")`
error: aborting due to 13 previous errors
error: this pattern reimplements `Option::unwrap_or`
--> $DIR/manual_unwrap_or.rs:201:17
|
LL | let _ = match some_macro!() {
| _________________^
LL | | Some(val) => val,
LL | | None => 0,
LL | | };
| |_________^ help: replace with: `some_macro!().unwrap_or(0)`
error: aborting due to 14 previous errors