about summary refs log tree commit diff
path: root/compiler/rustc_lint/src/reference_casting.rs
diff options
context:
space:
mode:
authorUrgau <urgau@numericable.fr>2024-05-05 19:14:20 +0200
committerUrgau <urgau@numericable.fr>2024-05-05 19:14:20 +0200
commitcd6a0c8c77575056f95d79ae1f5c460794e1388f (patch)
tree38d84a143a8b19d55aefc0aa932650a78c288765 /compiler/rustc_lint/src/reference_casting.rs
parent02f7806ecd641d67c8f046b073323c7e176ee6d2 (diff)
downloadrust-cd6a0c8c77575056f95d79ae1f5c460794e1388f.tar.gz
rust-cd6a0c8c77575056f95d79ae1f5c460794e1388f.zip
Fix insufficient logic when searching for the underlying allocation
in the `invalid_reference_casting` lint, when trying to lint on
bigger memory layout casts.
Diffstat (limited to 'compiler/rustc_lint/src/reference_casting.rs')
-rw-r--r--compiler/rustc_lint/src/reference_casting.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/compiler/rustc_lint/src/reference_casting.rs b/compiler/rustc_lint/src/reference_casting.rs
index 9fed91f7262..63d55a73a98 100644
--- a/compiler/rustc_lint/src/reference_casting.rs
+++ b/compiler/rustc_lint/src/reference_casting.rs
@@ -199,6 +199,13 @@ fn is_cast_to_bigger_memory_layout<'tcx>(
     let e_alloc = cx.expr_or_init(e);
     let e_alloc =
         if let ExprKind::AddrOf(_, _, inner_expr) = e_alloc.kind { inner_expr } else { e_alloc };
+
+    // if the current expr looks like this `&mut expr[index]` then just looking
+    // at `expr[index]` won't give us the underlying allocation, so we just skip it
+    if let ExprKind::Index(..) = e_alloc.kind {
+        return None;
+    }
+
     let alloc_ty = cx.typeck_results().node_type(e_alloc.hir_id);
 
     // if we do not find it we bail out, as this may not be UB