Skip to content

Commit

Permalink
Auto merge of rust-lang#7325 - Y-Nak:numeric-fallback, r=giraffate
Browse files Browse the repository at this point in the history
Fix FP in `default_numeric_fallback` with external macro expansion

fixes rust-lang#7304

changelog: Fix `default_numeric_fallback` FP with external macro expansion
  • Loading branch information
bors committed Jun 8, 2021
2 parents e4a1e85 + d7a380e commit c1577ab
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 26 deletions.
4 changes: 3 additions & 1 deletion clippy_lints/src/default_numeric_fallback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ use rustc_hir::{
intravisit::{walk_expr, walk_stmt, NestedVisitorMap, Visitor},
Body, Expr, ExprKind, HirId, Lit, Stmt, StmtKind,
};
use rustc_lint::{LateContext, LateLintPass};
use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::{
hir::map::Map,
lint::in_external_macro,
ty::{self, FloatTy, IntTy, PolyFnSig, Ty},
};
use rustc_session::{declare_lint_pass, declare_tool_lint};
Expand Down Expand Up @@ -73,6 +74,7 @@ impl<'a, 'tcx> NumericFallbackVisitor<'a, 'tcx> {
/// Check whether a passed literal has potential to cause fallback or not.
fn check_lit(&self, lit: &Lit, lit_ty: Ty<'tcx>) {
if_chain! {
if !in_external_macro(self.cx.sess(), lit.span);
if let Some(ty_bound) = self.ty_bounds.last();
if matches!(lit.node,
LitKind::Int(_, LitIntType::Unsuffixed) | LitKind::Float(_, LitFloatType::Unsuffixed));
Expand Down
7 changes: 7 additions & 0 deletions tests/ui/auxiliary/macro_rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,10 @@ macro_rules! field_reassign_with_default {
}
};
}

#[macro_export]
macro_rules! default_numeric_fallback {
() => {
let x = 22;
};
}
23 changes: 23 additions & 0 deletions tests/ui/default_numeric_fallback.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
// aux-build:macro_rules.rs

#![warn(clippy::default_numeric_fallback)]
#![allow(unused)]
#![allow(clippy::never_loop)]
#![allow(clippy::no_effect)]
#![allow(clippy::unnecessary_operation)]
#![allow(clippy::branches_sharing_code)]

#[macro_use]
extern crate macro_rules;

mod basic_expr {
fn test() {
// Should lint unsuffixed literals typed `i32`.
Expand Down Expand Up @@ -133,4 +138,22 @@ mod method_calls {
}
}

mod in_macro {
macro_rules! internal_macro {
() => {
let x = 22;
};
}

// Should lint in internal macro.
fn internal() {
internal_macro!();
}

// Should NOT lint in external macro.
fn external() {
default_numeric_fallback!();
}
}

fn main() {}
61 changes: 36 additions & 25 deletions tests/ui/default_numeric_fallback.stderr
Original file line number Diff line number Diff line change
@@ -1,148 +1,159 @@
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:11:17
--> $DIR/default_numeric_fallback.rs:16:17
|
LL | let x = 22;
| ^^ help: consider adding suffix: `22_i32`
|
= note: `-D clippy::default-numeric-fallback` implied by `-D warnings`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:12:18
--> $DIR/default_numeric_fallback.rs:17:18
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:12:21
--> $DIR/default_numeric_fallback.rs:17:21
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `2_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:12:24
--> $DIR/default_numeric_fallback.rs:17:24
|
LL | let x = [1, 2, 3];
| ^ help: consider adding suffix: `3_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:13:28
--> $DIR/default_numeric_fallback.rs:18:28
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:13:31
--> $DIR/default_numeric_fallback.rs:18:31
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `2_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:13:44
--> $DIR/default_numeric_fallback.rs:18:44
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `3_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:13:47
--> $DIR/default_numeric_fallback.rs:18:47
|
LL | let x = if true { (1, 2) } else { (3, 4) };
| ^ help: consider adding suffix: `4_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:14:23
--> $DIR/default_numeric_fallback.rs:19:23
|
LL | let x = match 1 {
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:15:13
--> $DIR/default_numeric_fallback.rs:20:13
|
LL | 1 => 1,
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:15:18
--> $DIR/default_numeric_fallback.rs:20:18
|
LL | 1 => 1,
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:16:18
--> $DIR/default_numeric_fallback.rs:21:18
|
LL | _ => 2,
| ^ help: consider adding suffix: `2_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:20:17
--> $DIR/default_numeric_fallback.rs:25:17
|
LL | let x = 0.12;
| ^^^^ help: consider adding suffix: `0.12_f64`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:38:21
--> $DIR/default_numeric_fallback.rs:43:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:46:21
--> $DIR/default_numeric_fallback.rs:51:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:52:21
--> $DIR/default_numeric_fallback.rs:57:21
|
LL | let y = 1;
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:64:9
--> $DIR/default_numeric_fallback.rs:69:9
|
LL | 1
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:70:27
--> $DIR/default_numeric_fallback.rs:75:27
|
LL | let f = || -> _ { 1 };
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:74:29
--> $DIR/default_numeric_fallback.rs:79:29
|
LL | let f = || -> i32 { 1 };
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:88:21
--> $DIR/default_numeric_fallback.rs:93:21
|
LL | generic_arg(1);
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:91:32
--> $DIR/default_numeric_fallback.rs:96:32
|
LL | let x: _ = generic_arg(1);
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:109:28
--> $DIR/default_numeric_fallback.rs:114:28
|
LL | GenericStruct { x: 1 };
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:112:36
--> $DIR/default_numeric_fallback.rs:117:36
|
LL | let _ = GenericStruct { x: 1 };
| ^ help: consider adding suffix: `1_i32`

error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:132:23
--> $DIR/default_numeric_fallback.rs:137:23
|
LL | s.generic_arg(1);
| ^ help: consider adding suffix: `1_i32`

error: aborting due to 24 previous errors
error: default numeric fallback might occur
--> $DIR/default_numeric_fallback.rs:144:21
|
LL | let x = 22;
| ^^ help: consider adding suffix: `22_i32`
...
LL | internal_macro!();
| ------------------ in this macro invocation
|
= note: this error originates in the macro `internal_macro` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 25 previous errors

0 comments on commit c1577ab

Please sign in to comment.