Skip to content

Commit c1577ab

Browse files
committed
Auto merge of #7325 - Y-Nak:numeric-fallback, r=giraffate
Fix FP in `default_numeric_fallback` with external macro expansion fixes #7304 changelog: Fix `default_numeric_fallback` FP with external macro expansion
2 parents e4a1e85 + d7a380e commit c1577ab

File tree

4 files changed

+69
-26
lines changed

4 files changed

+69
-26
lines changed

clippy_lints/src/default_numeric_fallback.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ use rustc_hir::{
77
intravisit::{walk_expr, walk_stmt, NestedVisitorMap, Visitor},
88
Body, Expr, ExprKind, HirId, Lit, Stmt, StmtKind,
99
};
10-
use rustc_lint::{LateContext, LateLintPass};
10+
use rustc_lint::{LateContext, LateLintPass, LintContext};
1111
use rustc_middle::{
1212
hir::map::Map,
13+
lint::in_external_macro,
1314
ty::{self, FloatTy, IntTy, PolyFnSig, Ty},
1415
};
1516
use rustc_session::{declare_lint_pass, declare_tool_lint};
@@ -73,6 +74,7 @@ impl<'a, 'tcx> NumericFallbackVisitor<'a, 'tcx> {
7374
/// Check whether a passed literal has potential to cause fallback or not.
7475
fn check_lit(&self, lit: &Lit, lit_ty: Ty<'tcx>) {
7576
if_chain! {
77+
if !in_external_macro(self.cx.sess(), lit.span);
7678
if let Some(ty_bound) = self.ty_bounds.last();
7779
if matches!(lit.node,
7880
LitKind::Int(_, LitIntType::Unsuffixed) | LitKind::Float(_, LitFloatType::Unsuffixed));

tests/ui/auxiliary/macro_rules.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,10 @@ macro_rules! field_reassign_with_default {
106106
}
107107
};
108108
}
109+
110+
#[macro_export]
111+
macro_rules! default_numeric_fallback {
112+
() => {
113+
let x = 22;
114+
};
115+
}

tests/ui/default_numeric_fallback.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
// aux-build:macro_rules.rs
2+
13
#![warn(clippy::default_numeric_fallback)]
24
#![allow(unused)]
35
#![allow(clippy::never_loop)]
46
#![allow(clippy::no_effect)]
57
#![allow(clippy::unnecessary_operation)]
68
#![allow(clippy::branches_sharing_code)]
79

10+
#[macro_use]
11+
extern crate macro_rules;
12+
813
mod basic_expr {
914
fn test() {
1015
// Should lint unsuffixed literals typed `i32`.
@@ -133,4 +138,22 @@ mod method_calls {
133138
}
134139
}
135140

141+
mod in_macro {
142+
macro_rules! internal_macro {
143+
() => {
144+
let x = 22;
145+
};
146+
}
147+
148+
// Should lint in internal macro.
149+
fn internal() {
150+
internal_macro!();
151+
}
152+
153+
// Should NOT lint in external macro.
154+
fn external() {
155+
default_numeric_fallback!();
156+
}
157+
}
158+
136159
fn main() {}
Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,148 +1,159 @@
11
error: default numeric fallback might occur
2-
--> $DIR/default_numeric_fallback.rs:11:17
2+
--> $DIR/default_numeric_fallback.rs:16:17
33
|
44
LL | let x = 22;
55
| ^^ help: consider adding suffix: `22_i32`
66
|
77
= note: `-D clippy::default-numeric-fallback` implied by `-D warnings`
88

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

147-
error: aborting due to 24 previous errors
147+
error: default numeric fallback might occur
148+
--> $DIR/default_numeric_fallback.rs:144:21
149+
|
150+
LL | let x = 22;
151+
| ^^ help: consider adding suffix: `22_i32`
152+
...
153+
LL | internal_macro!();
154+
| ------------------ in this macro invocation
155+
|
156+
= note: this error originates in the macro `internal_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
157+
158+
error: aborting due to 25 previous errors
148159

0 commit comments

Comments
 (0)