mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-10 23:24:24 +00:00
fix invalid code suggestion in manual_unwrap_or
, due to macro expansion
This commit is contained in:
parent
a362a4d1d0
commit
84003aa7a1
4 changed files with 48 additions and 2 deletions
|
@ -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,
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue