Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit eb89434

Browse files
saethlincuviper
authored andcommitted
Handle field projections like slice indexing in invalid_reference_casting
(cherry picked from commit 0ca1a94)
1 parent bd642ed commit eb89434

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

compiler/rustc_lint/src/reference_casting.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ fn is_cast_to_bigger_memory_layout<'tcx>(
201201

202202
// if the current expr looks like this `&mut expr[index]` then just looking
203203
// at `expr[index]` won't give us the underlying allocation, so we just skip it
204-
if let ExprKind::Index(..) = e_alloc.kind {
204+
// the same logic applies field access like `&mut expr.field`
205+
if let ExprKind::Index(..) | ExprKind::Field(..) = e_alloc.kind {
205206
return None;
206207
}
207208

tests/ui/lint/reference_casting.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,12 @@ unsafe fn bigger_layout() {
255255
let a3 = a2 as *mut u64;
256256
unsafe { *a3 = 3 };
257257
}
258+
259+
unsafe fn field_access(v: &mut Vec3<i32>) {
260+
let r = &mut v.0;
261+
let ptr = r as *mut i32 as *mut Vec3<i32>;
262+
unsafe { *ptr = Vec3(0, 0, 0) }
263+
}
258264
}
259265

260266
const RAW_PTR: *mut u8 = 1 as *mut u8;

0 commit comments

Comments
 (0)