diff options
| author | surechen <chenshuo17@huawei.com> | 2021-11-19 16:46:34 +0800 |
|---|---|---|
| committer | surechen <chenshuo17@huawei.com> | 2021-11-21 14:28:44 +0800 |
| commit | 846c0bef075922032ea21a42750fdadfe2542e5a (patch) | |
| tree | b8d9e7c6ed07023d8edfd28b3e57d9e9753adaec | |
| parent | bb58dc84c11c7699b1289f802c548d6a156a6eb7 (diff) | |
| download | rust-846c0bef075922032ea21a42750fdadfe2542e5a.tar.gz rust-846c0bef075922032ea21a42750fdadfe2542e5a.zip | |
Fixes #7915
Fix shadow_same's positive false for async function's params:
Example Code:
```rust
#![deny(clippy::shadow_same)]
pub async fn foo(_a: i32) {
}
```
Output:
```
error: `_a` is shadowed by itself in `_a
```
Hir:
```rust
pub async fn foo(_a: i32)
->
/*impl Trait*/ #[lang = "from_generator"](move |mut _task_context|
{
let _a = _a;
{ let _t = { }; _t }
})
```
Skip checking async function's params.
changelog: Fix shadow_same's positive false for async function's params
| -rw-r--r-- | clippy_lints/src/shadow.rs | 7 | ||||
| -rw-r--r-- | tests/ui/shadow.rs | 6 | ||||
| -rw-r--r-- | tests/ui/shadow.stderr | 14 |
3 files changed, 25 insertions, 2 deletions
diff --git a/clippy_lints/src/shadow.rs b/clippy_lints/src/shadow.rs index 5f82aed872c..f6880af0cab 100644 --- a/clippy_lints/src/shadow.rs +++ b/clippy_lints/src/shadow.rs @@ -105,11 +105,16 @@ impl<'tcx> LateLintPass<'tcx> for Shadow { PatKind::Binding(_, hir_id, ident, _) => (hir_id, ident), _ => return, }; + + if pat.span.desugaring_kind().is_some() { + return; + } + if ident.span.from_expansion() || ident.span.is_dummy() { return; } - let HirId { owner, local_id } = id; + let HirId { owner, local_id } = id; // get (or insert) the list of items for this owner and symbol let data = self.bindings.last_mut().unwrap(); let items_with_name = data.entry(ident.name).or_default(); diff --git a/tests/ui/shadow.rs b/tests/ui/shadow.rs index 55caef59f7f..06f6949b66f 100644 --- a/tests/ui/shadow.rs +++ b/tests/ui/shadow.rs @@ -79,4 +79,10 @@ fn question_mark() -> Option<()> { None } +pub async fn foo1(_a: i32) {} + +pub async fn foo2(_a: i32, _b: i64) { + let _b = _a; +} + fn main() {} diff --git a/tests/ui/shadow.stderr b/tests/ui/shadow.stderr index feed6e1ba8b..dcc7d4e6b2f 100644 --- a/tests/ui/shadow.stderr +++ b/tests/ui/shadow.stderr @@ -241,5 +241,17 @@ note: previous binding is here LL | let _ = |[x]: [u32; 1]| { | ^ -error: aborting due to 20 previous errors +error: `_b` shadows a previous, unrelated binding + --> $DIR/shadow.rs:85:9 + | +LL | let _b = _a; + | ^^ + | +note: previous binding is here + --> $DIR/shadow.rs:84:28 + | +LL | pub async fn foo2(_a: i32, _b: i64) { + | ^^ + +error: aborting due to 21 previous errors |
