mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-04 01:42:54 +03:00
fix: ignore pattern_type_mismatch when external macro owns the match
changelog: [`pattern_type_mismatch`]: fix unwanted hit in external macro
This commit is contained in:
@@ -96,6 +96,12 @@ fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) {
|
||||
|
||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
||||
if let ExprKind::Match(_, arms, _) = expr.kind {
|
||||
// if the match is generated by an external macro, the writer does not control
|
||||
// how the scrutinee (`match &scrutiny { ... }`) is matched
|
||||
if expr.span.in_external_macro(cx.sess().source_map()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for arm in arms {
|
||||
let pat = &arm.pat;
|
||||
if apply_lint(cx, pat, DerefPossible::Possible) {
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
//! **FAKE** external macro crate.
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! macro_with_match {
|
||||
( $p:pat ) => {
|
||||
let something = ();
|
||||
|
||||
match &something {
|
||||
$p => true,
|
||||
_ => false,
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -6,6 +6,9 @@
|
||||
clippy::single_match
|
||||
)]
|
||||
|
||||
//@aux-build:external.rs
|
||||
use external::macro_with_match;
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn syntax_match() {
|
||||
@@ -159,3 +162,9 @@ macro_rules! matching_macro {
|
||||
let value = &Some(23);
|
||||
matching_macro!(value);
|
||||
}
|
||||
|
||||
fn external_macro_expansion() {
|
||||
macro_with_match! {
|
||||
()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:16:9
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:19:9
|
||||
|
|
||||
LL | Some(_) => (),
|
||||
| ^^^^^^^
|
||||
@@ -9,7 +9,7 @@ LL | Some(_) => (),
|
||||
= help: to override `-D warnings` add `#[allow(clippy::pattern_type_mismatch)]`
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:36:12
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:39:12
|
||||
|
|
||||
LL | if let Some(_) = ref_value {}
|
||||
| ^^^^^^^
|
||||
@@ -17,7 +17,7 @@ LL | if let Some(_) = ref_value {}
|
||||
= help: use `*` to dereference the match expression or explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:48:15
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:51:15
|
||||
|
|
||||
LL | while let Some(_) = ref_value {
|
||||
| ^^^^^^^
|
||||
@@ -25,7 +25,7 @@ LL | while let Some(_) = ref_value {
|
||||
= help: use `*` to dereference the match expression or explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:68:9
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:71:9
|
||||
|
|
||||
LL | for (_a, _b) in slice.iter() {}
|
||||
| ^^^^^^^^
|
||||
@@ -33,7 +33,7 @@ LL | for (_a, _b) in slice.iter() {}
|
||||
= help: explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:79:9
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:82:9
|
||||
|
|
||||
LL | let (_n, _m) = ref_value;
|
||||
| ^^^^^^^^
|
||||
@@ -41,7 +41,7 @@ LL | let (_n, _m) = ref_value;
|
||||
= help: use `*` to dereference the match expression or explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:89:12
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:92:12
|
||||
|
|
||||
LL | fn foo((_a, _b): &(i32, i32)) {}
|
||||
| ^^^^^^^^
|
||||
@@ -49,7 +49,7 @@ LL | fn foo((_a, _b): &(i32, i32)) {}
|
||||
= help: explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:104:10
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:107:10
|
||||
|
|
||||
LL | foo(|(_a, _b)| ());
|
||||
| ^^^^^^^^
|
||||
@@ -57,7 +57,7 @@ LL | foo(|(_a, _b)| ());
|
||||
= help: explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:121:9
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:124:9
|
||||
|
|
||||
LL | Some(_) => (),
|
||||
| ^^^^^^^
|
||||
@@ -65,7 +65,7 @@ LL | Some(_) => (),
|
||||
= help: use `*` to dereference the match expression or explicitly match against a `&_` pattern and adjust the enclosed variable bindings
|
||||
|
||||
error: type of pattern does not match the expression type
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:142:17
|
||||
--> tests/ui/pattern_type_mismatch/syntax.rs:145:17
|
||||
|
|
||||
LL | Some(_) => (),
|
||||
| ^^^^^^^
|
||||
|
||||
Reference in New Issue
Block a user