use rustc_middle::mir::visit::{PlaceContext, Visitor};
use rustc_middle::mir::*;
use rustc_middle::ty::{self, TyCtxt};
-use rustc_session::lint::builtin::PACKED_REFERENCES;
+use rustc_session::lint::builtin::UNALIGNED_REFERENCES;
use crate::transform::{MirPass, MirSource};
use crate::util;
.assert_crate_local()
.lint_root;
self.tcx.struct_span_lint_hir(
- PACKED_REFERENCES,
+ UNALIGNED_REFERENCES,
lint_root,
source_info.span,
|lint| {
- lint.build(&format!("reference to packed field is not allowed",))
+ lint.build(&format!("reference to packed field is unaligned",))
.note(
- "fields of packed structs might be misaligned, and creating \
+ "fields of packed structs are not properly aligned, and creating \
a misaligned reference is undefined behavior (even if that \
reference is never dereferenced)",
)
}
declare_lint! {
- pub PACKED_REFERENCES,
+ pub UNALIGNED_REFERENCES,
Allow,
"detects unaligned references to fields of packed structs",
}
INVALID_TYPE_PARAM_DEFAULT,
CONST_ERR,
RENAMED_AND_REMOVED_LINTS,
- PACKED_REFERENCES,
+ UNALIGNED_REFERENCES,
SAFE_PACKED_BORROWS,
PATTERNS_IN_FNS_WITHOUT_BODY,
MISSING_FRAGMENT_SPECIFIER,
+++ /dev/null
-#![deny(packed_references)]
-
-#[repr(packed)]
-pub struct Good {
- data: &'static u32,
- data2: [&'static u32; 2],
- aligned: [u8; 32],
-}
-
-fn main() {
- unsafe {
- let good = Good { data: &0, data2: [&0, &0], aligned: [0; 32] };
-
- let _ = &good.data; //~ ERROR reference to packed field
- let _ = &good.data as *const _; //~ ERROR reference to packed field
- let _: *const _ = &good.data; //~ ERROR reference to packed field
- let _ = &good.data2[0]; //~ ERROR reference to packed field
- let _ = &*good.data; // ok, behind a pointer
- let _ = &good.aligned; // ok, has align 1
- let _ = &good.aligned[2]; // ok, has align 1
- }
-}
+++ /dev/null
-error: reference to packed field is not allowed
- --> $DIR/packed_reference.rs:14:17
- |
-LL | let _ = &good.data;
- | ^^^^^^^^^^
- |
-note: the lint level is defined here
- --> $DIR/packed_reference.rs:1:9
- |
-LL | #![deny(packed_references)]
- | ^^^^^^^^^^^^^^^^^
- = note: fields of packed structs might be misaligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
-
-error: reference to packed field is not allowed
- --> $DIR/packed_reference.rs:15:17
- |
-LL | let _ = &good.data as *const _;
- | ^^^^^^^^^^
- |
- = note: fields of packed structs might be misaligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
-
-error: reference to packed field is not allowed
- --> $DIR/packed_reference.rs:16:27
- |
-LL | let _: *const _ = &good.data;
- | ^^^^^^^^^^
- |
- = note: fields of packed structs might be misaligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
-
-error: reference to packed field is not allowed
- --> $DIR/packed_reference.rs:17:17
- |
-LL | let _ = &good.data2[0];
- | ^^^^^^^^^^^^^^
- |
- = note: fields of packed structs might be misaligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
-
-error: aborting due to 4 previous errors
-
--- /dev/null
+#![deny(unaligned_references)]
+
+#[repr(packed)]
+pub struct Good {
+ data: &'static u32,
+ data2: [&'static u32; 2],
+ aligned: [u8; 32],
+}
+
+fn main() {
+ unsafe {
+ let good = Good { data: &0, data2: [&0, &0], aligned: [0; 32] };
+
+ let _ = &good.data; //~ ERROR reference to packed field
+ let _ = &good.data as *const _; //~ ERROR reference to packed field
+ let _: *const _ = &good.data; //~ ERROR reference to packed field
+ let _ = &good.data2[0]; //~ ERROR reference to packed field
+ let _ = &*good.data; // ok, behind a pointer
+ let _ = &good.aligned; // ok, has align 1
+ let _ = &good.aligned[2]; // ok, has align 1
+ }
+}
--- /dev/null
+error: reference to packed field is unaligned
+ --> $DIR/unaligned_references.rs:14:17
+ |
+LL | let _ = &good.data;
+ | ^^^^^^^^^^
+ |
+note: the lint level is defined here
+ --> $DIR/unaligned_references.rs:1:9
+ |
+LL | #![deny(unaligned_references)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
+
+error: reference to packed field is unaligned
+ --> $DIR/unaligned_references.rs:15:17
+ |
+LL | let _ = &good.data as *const _;
+ | ^^^^^^^^^^
+ |
+ = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
+
+error: reference to packed field is unaligned
+ --> $DIR/unaligned_references.rs:16:27
+ |
+LL | let _: *const _ = &good.data;
+ | ^^^^^^^^^^
+ |
+ = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
+
+error: reference to packed field is unaligned
+ --> $DIR/unaligned_references.rs:17:17
+ |
+LL | let _ = &good.data2[0];
+ | ^^^^^^^^^^^^^^
+ |
+ = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
+
+error: aborting due to 4 previous errors
+