Skip to content

Commit

Permalink
Auto merge of rust-lang#7396 - ranweiler:zero-offset, r=Manishearth
Browse files Browse the repository at this point in the history
Fix invocation of `zst_offset` lint

The `zst_offset` lint was broken by a refactoring regression in 2108387. In the invocation of the `zst_offset` check [here](rust-lang/rust-clippy@2108387#diff-7f73f6fe28c04b654223c09c42fe02937d2351fc58a91d21ab812aaf6f9b185dR1927), we shadow the already-destructured receiver `recv`, and accidentally pass the first argument of the method as if it were the receiver.

This was not caught because the UI test expectation was never correct (a bad cast obscured the actual test result).

This PR:
- Fixes the existing test expectation
- Tests both `const` and `mut` raw pointers
- Passes the actual receiver to the lint's implementation

Fixes rust-lang#7395.

changelog: Fix [`zst_offset`] invocation and test
  • Loading branch information
bors committed Jun 23, 2021
2 parents 417401f + 642239c commit d568387
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 14 deletions.
2 changes: 1 addition & 1 deletion clippy_lints/src/methods/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2036,7 +2036,7 @@ impl<'tcx> LateLintPass<'tcx> for Methods {
fn check_methods<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, msrv: Option<&RustcVersion>) {
if let Some((name, [recv, args @ ..], span)) = method_call!(expr) {
match (name, args) {
("add" | "offset" | "sub" | "wrapping_offset" | "wrapping_add" | "wrapping_sub", [recv, _]) => {
("add" | "offset" | "sub" | "wrapping_offset" | "wrapping_add" | "wrapping_sub", [_arg]) => {
zst_offset::check(cx, expr, recv);
},
("and_then", [arg]) => {
Expand Down
20 changes: 13 additions & 7 deletions tests/ui/zero_offset.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
fn main() {
unsafe {
let x = &() as *const ();
x.offset(0);
x.wrapping_add(0);
x.sub(0);
x.wrapping_sub(0);
let m = &mut () as *mut ();
m.offset(0);
m.wrapping_add(0);
m.sub(0);
m.wrapping_sub(0);

let y = &1 as *const u8;
y.offset(0);
let c = &() as *const ();
c.offset(0);
c.wrapping_add(0);
c.sub(0);
c.wrapping_sub(0);

let sized = &1 as *const i32;
sized.offset(0);
}
}
55 changes: 49 additions & 6 deletions tests/ui/zero_offset.stderr
Original file line number Diff line number Diff line change
@@ -1,9 +1,52 @@
error[E0606]: casting `&i32` as `*const u8` is invalid
--> $DIR/zero_offset.rs:9:17
error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:4:9
|
LL | let y = &1 as *const u8;
| ^^^^^^^^^^^^^^^
LL | m.offset(0);
| ^^^^^^^^^^^
|
= note: `#[deny(clippy::zst_offset)]` on by default

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:5:9
|
LL | m.wrapping_add(0);
| ^^^^^^^^^^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:6:9
|
LL | m.sub(0);
| ^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:7:9
|
LL | m.wrapping_sub(0);
| ^^^^^^^^^^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:10:9
|
LL | c.offset(0);
| ^^^^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:11:9
|
LL | c.wrapping_add(0);
| ^^^^^^^^^^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:12:9
|
LL | c.sub(0);
| ^^^^^^^^

error: offset calculation on zero-sized value
--> $DIR/zero_offset.rs:13:9
|
LL | c.wrapping_sub(0);
| ^^^^^^^^^^^^^^^^^

error: aborting due to previous error
error: aborting due to 8 previous errors

For more information about this error, try `rustc --explain E0606`.

0 comments on commit d568387

Please sign in to comment.