Skip to content

Commit

Permalink
Auto merge of rust-lang#8311 - dswij:8277, r=llogiq
Browse files Browse the repository at this point in the history
fix `needless_question_mark` not considering async fn

closes rust-lang#8277

changelog: [`needless_question_mark`] Fix FN on async functions
  • Loading branch information
bors committed Jan 23, 2022
2 parents 788a8bc + a052766 commit d976d8a
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 3 deletions.
23 changes: 21 additions & 2 deletions clippy_lints/src/needless_question_mark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use clippy_utils::source::snippet;
use if_chain::if_chain;
use rustc_errors::Applicability;
use rustc_hir::LangItem::{OptionSome, ResultOk};
use rustc_hir::{Body, Expr, ExprKind, LangItem, MatchSource, QPath};
use rustc_hir::{AsyncGeneratorKind, Block, Body, Expr, ExprKind, GeneratorKind, LangItem, MatchSource, QPath};
use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::ty::TyS;
use rustc_session::{declare_lint_pass, declare_tool_lint};
Expand Down Expand Up @@ -88,7 +88,26 @@ impl LateLintPass<'_> for NeedlessQuestionMark {
}

fn check_body(&mut self, cx: &LateContext<'_>, body: &'_ Body<'_>) {
check(cx, body.value.peel_blocks());
if let Some(GeneratorKind::Async(AsyncGeneratorKind::Fn)) = body.generator_kind {
if let ExprKind::Block(
Block {
expr:
Some(Expr {
kind: ExprKind::DropTemps(async_body),
..
}),
..
},
_,
) = body.value.kind
{
if let ExprKind::Block(Block { expr: Some(expr), .. }, ..) = async_body.kind {
check(cx, expr);
}
}
} else {
check(cx, body.value.peel_blocks());
}
}
}

Expand Down
13 changes: 13 additions & 0 deletions tests/ui/needless_question_mark.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,16 @@ pub fn test2() {
let x = Some(3);
let _x = some_and_qmark_in_macro!(x?);
}

async fn async_option_bad(to: TO) -> Option<usize> {
let _ = Some(3);
to.magic
}

async fn async_deref_ref(s: Option<&String>) -> Option<&str> {
Some(s?)
}

async fn async_result_bad(s: TR) -> Result<usize, bool> {
s.magic
}
13 changes: 13 additions & 0 deletions tests/ui/needless_question_mark.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,16 @@ pub fn test2() {
let x = Some(3);
let _x = some_and_qmark_in_macro!(x?);
}

async fn async_option_bad(to: TO) -> Option<usize> {
let _ = Some(3);
Some(to.magic?)
}

async fn async_deref_ref(s: Option<&String>) -> Option<&str> {
Some(s?)
}

async fn async_result_bad(s: TR) -> Result<usize, bool> {
Ok(s.magic?)
}
14 changes: 13 additions & 1 deletion tests/ui/needless_question_mark.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,17 @@ LL | let _x = some_and_qmark_in_macro!(x?);
|
= note: this error originates in the macro `some_and_qmark_in_macro` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 12 previous errors
error: question mark operator is useless here
--> $DIR/needless_question_mark.rs:131:5
|
LL | Some(to.magic?)
| ^^^^^^^^^^^^^^^ help: try removing question mark and `Some()`: `to.magic`

error: question mark operator is useless here
--> $DIR/needless_question_mark.rs:139:5
|
LL | Ok(s.magic?)
| ^^^^^^^^^^^^ help: try removing question mark and `Ok()`: `s.magic`

error: aborting due to 14 previous errors

0 comments on commit d976d8a

Please sign in to comment.