Skip to content

Commit 032ae96

Browse files
committed
Auto merge of #4257 - skade:improve-cast-alignment, r=flip1995
Improve cast_ptr_alignment lint <!-- Thank you for making Clippy better! We're collecting our changelog from pull request descriptions. If your PR only updates to the latest nightly, you can leave the `changelog` entry as `none`. Otherwise, please write a short comment explaining your change. If your PR fixes an issue, you can add "fixes #issue_number" into this PR description. This way the issue will be automatically closed when your PR is merged. If you added a new lint, here's a checklist for things that will be checked during review or continuous integration. - [x] Followed [lint naming conventions][lint_naming] - [x] Added passing UI tests (including committed `.stderr` file) - [x] `cargo test` passes locally - [x] Executed `util/dev update_lints` - [x] Added lint documentation - [x] Run `cargo fmt` Note that you can skip the above if you are just opening a WIP PR in order to get feedback. Delete this line and everything above before opening your PR --> * print alignment in bytes in the lint message * ignore ZST left-hand types Fixes #3797 and #4256 changelog: * `cast_ptr_alignment`: Print alignment in bytes in the lint message * `cast_ptr_alignment`: Ignore casting from ZST left-hand types
2 parents f0d2170 + aa72cac commit 032ae96

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

clippy_lints/src/types.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -1211,17 +1211,25 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Casts {
12111211
if_chain! {
12121212
if let ty::RawPtr(from_ptr_ty) = &cast_from.sty;
12131213
if let ty::RawPtr(to_ptr_ty) = &cast_to.sty;
1214-
if let Some(from_align) = cx.layout_of(from_ptr_ty.ty).ok().map(|a| a.align.abi);
1215-
if let Some(to_align) = cx.layout_of(to_ptr_ty.ty).ok().map(|a| a.align.abi);
1216-
if from_align < to_align;
1214+
if let Ok(from_layout) = cx.layout_of(from_ptr_ty.ty);
1215+
if let Ok(to_layout) = cx.layout_of(to_ptr_ty.ty);
1216+
if from_layout.align.abi < to_layout.align.abi;
12171217
// with c_void, we inherently need to trust the user
12181218
if !is_c_void(cx, from_ptr_ty.ty);
1219+
// when casting from a ZST, we don't know enough to properly lint
1220+
if !from_layout.is_zst();
12191221
then {
12201222
span_lint(
12211223
cx,
12221224
CAST_PTR_ALIGNMENT,
12231225
expr.span,
1224-
&format!("casting from `{}` to a more-strictly-aligned pointer (`{}`)", cast_from, cast_to)
1226+
&format!(
1227+
"casting from `{}` to a more-strictly-aligned pointer (`{}`) ({} < {} bytes)",
1228+
cast_from,
1229+
cast_to,
1230+
from_layout.align.abi.bytes(),
1231+
to_layout.align.abi.bytes(),
1232+
),
12251233
);
12261234
}
12271235
}

tests/ui/cast_alignment.rs

+2
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ fn main() {
2222
// For c_void, we should trust the user. See #2677
2323
(&1u32 as *const u32 as *const std::os::raw::c_void) as *const u32;
2424
(&1u32 as *const u32 as *const libc::c_void) as *const u32;
25+
// For ZST, we should trust the user. See #4256
26+
(&1u32 as *const u32 as *const ()) as *const u32;
2527
}

tests/ui/cast_alignment.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`)
1+
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`) (1 < 2 bytes)
22
--> $DIR/cast_alignment.rs:12:5
33
|
44
LL | (&1u8 as *const u8) as *const u16;
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66
|
77
= note: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
88

9-
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`)
9+
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
1010
--> $DIR/cast_alignment.rs:13:5
1111
|
1212
LL | (&mut 1u8 as *mut u8) as *mut u16;

0 commit comments

Comments
 (0)