Auto merge of #82587 - taiki-e:unaligned_references, r=oli-obk
Enable report_in_external_macro in unaligned_references Fixes an issue where `unaligned_references` is not triggered in external macros, unlike `safe_packed_borrows`. Also, given that this lint is planned to eventually change to hard error (#82525), it would make sense for this lint to be triggered for external macros as well. See https://github.com/taiki-e/pin-project-lite/pull/55#issuecomment-787038676 and https://github.com/taiki-e/pin-project-lite/pull/55#issuecomment-787052874 for more. r? `@RalfJung`
This commit is contained in:
commit
ccad218e7f
@ -1080,6 +1080,7 @@
|
||||
pub UNALIGNED_REFERENCES,
|
||||
Allow,
|
||||
"detects unaligned references to fields of packed structs",
|
||||
report_in_external_macro
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
|
@ -0,0 +1,28 @@
|
||||
#[macro_export]
|
||||
macro_rules! mac {
|
||||
(
|
||||
$(#[$attrs:meta])*
|
||||
pub struct $ident:ident {
|
||||
$(
|
||||
$(#[$pin:ident])?
|
||||
$field_vis:vis $field:ident: $field_ty:ty
|
||||
),+ $(,)?
|
||||
}
|
||||
) => {
|
||||
$(#[$attrs])*
|
||||
pub struct $ident {
|
||||
$(
|
||||
$field_vis $field: $field_ty
|
||||
),+
|
||||
}
|
||||
|
||||
const _: () = {
|
||||
#[deny(unaligned_references)]
|
||||
fn __f(this: &$ident) {
|
||||
$(
|
||||
let _ = &this.$field;
|
||||
)+
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
14
src/test/ui/lint/unaligned_references_external_macro.rs
Normal file
14
src/test/ui/lint/unaligned_references_external_macro.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// aux-build:unaligned_references_external_crate.rs
|
||||
|
||||
#![allow(safe_packed_borrows)]
|
||||
|
||||
extern crate unaligned_references_external_crate;
|
||||
|
||||
unaligned_references_external_crate::mac! { //~ERROR reference to packed field is unaligned
|
||||
#[repr(packed)]
|
||||
pub struct X {
|
||||
pub field: u16
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
26
src/test/ui/lint/unaligned_references_external_macro.stderr
Normal file
26
src/test/ui/lint/unaligned_references_external_macro.stderr
Normal file
@ -0,0 +1,26 @@
|
||||
error: reference to packed field is unaligned
|
||||
--> $DIR/unaligned_references_external_macro.rs:7:1
|
||||
|
|
||||
LL | / unaligned_references_external_crate::mac! {
|
||||
LL | | #[repr(packed)]
|
||||
LL | | pub struct X {
|
||||
LL | | pub field: u16
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unaligned_references_external_macro.rs:7:1
|
||||
|
|
||||
LL | / unaligned_references_external_crate::mac! {
|
||||
LL | | #[repr(packed)]
|
||||
LL | | pub struct X {
|
||||
LL | | pub field: u16
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_^
|
||||
= note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced)
|
||||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user