Skip to content

Commit d48ee0b

Browse files
committed
Check for enabled int_roundings feature in manual_div_ceil
1 parent 46161b7 commit d48ee0b

7 files changed

+149
-38
lines changed

clippy_lints/src/manual_div_ceil.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use rustc_hir::{Expr, ExprKind};
1010
use rustc_lint::{LateContext, LateLintPass};
1111
use rustc_middle::ty::{self};
1212
use rustc_session::impl_lint_pass;
13+
use rustc_span::symbol::Symbol;
1314

1415
declare_clippy_lint! {
1516
/// ### What it does
@@ -60,8 +61,8 @@ impl<'tcx> LateLintPass<'tcx> for ManualDivCeil {
6061
let mut applicability = Applicability::MachineApplicable;
6162

6263
if let ExprKind::Binary(div_op, div_lhs, div_rhs) = expr.kind
63-
&& check_int_ty(cx, div_lhs)
64-
&& check_int_ty(cx, div_rhs)
64+
&& check_int_ty_and_feature(cx, div_lhs)
65+
&& check_int_ty_and_feature(cx, div_rhs)
6566
&& div_op.node == BinOpKind::Div
6667
{
6768
// (x + (y - 1)) / y
@@ -104,9 +105,18 @@ impl<'tcx> LateLintPass<'tcx> for ManualDivCeil {
104105
extract_msrv_attr!(LateContext);
105106
}
106107

107-
fn check_int_ty(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
108+
fn check_int_ty_and_feature(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
108109
let expr_ty = cx.typeck_results().expr_ty(expr);
109-
matches!(expr_ty.peel_refs().kind(), ty::Int(_) | ty::Uint(_))
110+
match expr_ty.peel_refs().kind() {
111+
ty::Uint(_) => true,
112+
ty::Int(_) => cx
113+
.tcx
114+
.features()
115+
.declared_features
116+
.contains(&Symbol::intern("int_roundings")),
117+
118+
_ => false,
119+
}
110120
}
111121

112122
fn check_literal(expr: &Expr<'_>) -> bool {

tests/ui/manual_div_ceil.fixed

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
#![warn(clippy::manual_div_ceil)]
2-
#![feature(int_roundings)]
32

43
fn main() {
5-
let x = 7_i32;
6-
let y = 4_i32;
7-
let z_u: u32 = 11;
4+
let x = 7_u32;
5+
let y = 4_u32;
6+
let z = 11_u32;
87

98
// Lint.
109
let _ = x.div_ceil(y);
1110
let _ = x.div_ceil(y);
1211
let _ = x.div_ceil(y);
1312

14-
let _ = 7_i32.div_ceil(4);
15-
16-
let _ = (z_u as i32).div_ceil(y);
17-
let _ = (7_u32 as i32).div_ceil(y);
13+
let _ = 7_u32.div_ceil(4);
14+
let _ = (7_i32 as u32).div_ceil(4);
1815

1916
// No lint.
2017
let _ = (x + (y - 2)) / y;
2118
let _ = (x + (y + 1)) / y;
2219

23-
let z = 3_i32;
2420
let _ = (x + (y - 1)) / z;
21+
22+
let x_i = 7_i32;
23+
let y_i = 4_i32;
24+
let z_i = 11_i32;
25+
26+
// No lint because `int_roundings` feature is not enabled.
27+
let _ = (z as i32 + (y_i - 1)) / y_i;
28+
let _ = (7_u32 as i32 + (y_i - 1)) / y_i;
29+
let _ = (7_u32 as i32 + (4 - 1)) / 4;
2530
}

tests/ui/manual_div_ceil.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
#![warn(clippy::manual_div_ceil)]
2-
#![feature(int_roundings)]
32

43
fn main() {
5-
let x = 7_i32;
6-
let y = 4_i32;
7-
let z_u: u32 = 11;
4+
let x = 7_u32;
5+
let y = 4_u32;
6+
let z = 11_u32;
87

98
// Lint.
109
let _ = (x + (y - 1)) / y;
1110
let _ = ((y - 1) + x) / y;
1211
let _ = (x + y - 1) / y;
1312

14-
let _ = (7_i32 + (4 - 1)) / 4;
15-
16-
let _ = (z_u as i32 + (y - 1)) / y;
17-
let _ = (7_u32 as i32 + (y - 1)) / y;
13+
let _ = (7_u32 + (4 - 1)) / 4;
14+
let _ = (7_i32 as u32 + (4 - 1)) / 4;
1815

1916
// No lint.
2017
let _ = (x + (y - 2)) / y;
2118
let _ = (x + (y + 1)) / y;
2219

23-
let z = 3_i32;
2420
let _ = (x + (y - 1)) / z;
21+
22+
let x_i = 7_i32;
23+
let y_i = 4_i32;
24+
let z_i = 11_i32;
25+
26+
// No lint because `int_roundings` feature is not enabled.
27+
let _ = (z as i32 + (y_i - 1)) / y_i;
28+
let _ = (7_u32 as i32 + (y_i - 1)) / y_i;
29+
let _ = (7_u32 as i32 + (4 - 1)) / 4;
2530
}

tests/ui/manual_div_ceil.stderr

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: manually reimplementing `div_ceil`
2-
--> tests/ui/manual_div_ceil.rs:10:13
2+
--> tests/ui/manual_div_ceil.rs:9:13
33
|
44
LL | let _ = (x + (y - 1)) / y;
55
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
@@ -8,34 +8,28 @@ LL | let _ = (x + (y - 1)) / y;
88
= help: to override `-D warnings` add `#[allow(clippy::manual_div_ceil)]`
99

1010
error: manually reimplementing `div_ceil`
11-
--> tests/ui/manual_div_ceil.rs:11:13
11+
--> tests/ui/manual_div_ceil.rs:10:13
1212
|
1313
LL | let _ = ((y - 1) + x) / y;
1414
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
1515

1616
error: manually reimplementing `div_ceil`
17-
--> tests/ui/manual_div_ceil.rs:12:13
17+
--> tests/ui/manual_div_ceil.rs:11:13
1818
|
1919
LL | let _ = (x + y - 1) / y;
2020
| ^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
2121

2222
error: manually reimplementing `div_ceil`
23-
--> tests/ui/manual_div_ceil.rs:14:13
23+
--> tests/ui/manual_div_ceil.rs:13:13
2424
|
25-
LL | let _ = (7_i32 + (4 - 1)) / 4;
26-
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `7_i32.div_ceil(4)`
25+
LL | let _ = (7_u32 + (4 - 1)) / 4;
26+
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `7_u32.div_ceil(4)`
2727

2828
error: manually reimplementing `div_ceil`
29-
--> tests/ui/manual_div_ceil.rs:16:13
30-
|
31-
LL | let _ = (z_u as i32 + (y - 1)) / y;
32-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(z_u as i32).div_ceil(y)`
33-
34-
error: manually reimplementing `div_ceil`
35-
--> tests/ui/manual_div_ceil.rs:17:13
29+
--> tests/ui/manual_div_ceil.rs:14:13
3630
|
37-
LL | let _ = (7_u32 as i32 + (y - 1)) / y;
38-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(7_u32 as i32).div_ceil(y)`
31+
LL | let _ = (7_i32 as u32 + (4 - 1)) / 4;
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(7_i32 as u32).div_ceil(4)`
3933

40-
error: aborting due to 6 previous errors
34+
error: aborting due to 5 previous errors
4135

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#![warn(clippy::manual_div_ceil)]
2+
#![feature(int_roundings)]
3+
4+
fn main() {
5+
let x = 7_i32;
6+
let y = 4_i32;
7+
let z = 3_i32;
8+
let z_u: u32 = 11;
9+
10+
// Lint.
11+
let _ = x.div_ceil(y);
12+
let _ = x.div_ceil(y);
13+
let _ = x.div_ceil(y);
14+
15+
let _ = 7_i32.div_ceil(4);
16+
let _ = (7_i32 as u32).div_ceil(4);
17+
let _ = (7_u32 as i32).div_ceil(4);
18+
let _ = z_u.div_ceil(4);
19+
20+
// No lint.
21+
let _ = (x + (y - 2)) / y;
22+
let _ = (x + (y + 1)) / y;
23+
24+
let _ = (x + (y - 1)) / z;
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#![warn(clippy::manual_div_ceil)]
2+
#![feature(int_roundings)]
3+
4+
fn main() {
5+
let x = 7_i32;
6+
let y = 4_i32;
7+
let z = 3_i32;
8+
let z_u: u32 = 11;
9+
10+
// Lint.
11+
let _ = (x + (y - 1)) / y;
12+
let _ = ((y - 1) + x) / y;
13+
let _ = (x + y - 1) / y;
14+
15+
let _ = (7_i32 + (4 - 1)) / 4;
16+
let _ = (7_i32 as u32 + (4 - 1)) / 4;
17+
let _ = (7_u32 as i32 + (4 - 1)) / 4;
18+
let _ = (z_u + (4 - 1)) / 4;
19+
20+
// No lint.
21+
let _ = (x + (y - 2)) / y;
22+
let _ = (x + (y + 1)) / y;
23+
24+
let _ = (x + (y - 1)) / z;
25+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
error: manually reimplementing `div_ceil`
2+
--> tests/ui/manual_div_ceil_with_feature.rs:11:13
3+
|
4+
LL | let _ = (x + (y - 1)) / y;
5+
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
6+
|
7+
= note: `-D clippy::manual-div-ceil` implied by `-D warnings`
8+
= help: to override `-D warnings` add `#[allow(clippy::manual_div_ceil)]`
9+
10+
error: manually reimplementing `div_ceil`
11+
--> tests/ui/manual_div_ceil_with_feature.rs:12:13
12+
|
13+
LL | let _ = ((y - 1) + x) / y;
14+
| ^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
15+
16+
error: manually reimplementing `div_ceil`
17+
--> tests/ui/manual_div_ceil_with_feature.rs:13:13
18+
|
19+
LL | let _ = (x + y - 1) / y;
20+
| ^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `x.div_ceil(y)`
21+
22+
error: manually reimplementing `div_ceil`
23+
--> tests/ui/manual_div_ceil_with_feature.rs:15:13
24+
|
25+
LL | let _ = (7_i32 + (4 - 1)) / 4;
26+
| ^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `7_i32.div_ceil(4)`
27+
28+
error: manually reimplementing `div_ceil`
29+
--> tests/ui/manual_div_ceil_with_feature.rs:16:13
30+
|
31+
LL | let _ = (7_i32 as u32 + (4 - 1)) / 4;
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(7_i32 as u32).div_ceil(4)`
33+
34+
error: manually reimplementing `div_ceil`
35+
--> tests/ui/manual_div_ceil_with_feature.rs:17:13
36+
|
37+
LL | let _ = (7_u32 as i32 + (4 - 1)) / 4;
38+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `(7_u32 as i32).div_ceil(4)`
39+
40+
error: manually reimplementing `div_ceil`
41+
--> tests/ui/manual_div_ceil_with_feature.rs:18:13
42+
|
43+
LL | let _ = (z_u + (4 - 1)) / 4;
44+
| ^^^^^^^^^^^^^^^^^^^ help: consider using `.div_ceil()`: `z_u.div_ceil(4)`
45+
46+
error: aborting due to 7 previous errors
47+

0 commit comments

Comments
 (0)