mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-15 01:17:16 +00:00
Auto merge of #8311 - dswij:8277, r=llogiq
fix `needless_question_mark` not considering async fn closes #8277 changelog: [`needless_question_mark`] Fix FN on async functions
This commit is contained in:
commit
d976d8ad87
4 changed files with 60 additions and 3 deletions
|
@ -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};
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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?)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue