about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_lint_defs/src/builtin.rs1
-rw-r--r--src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs28
-rw-r--r--src/test/ui/lint/unaligned_references_external_macro.rs14
-rw-r--r--src/test/ui/lint/unaligned_references_external_macro.stderr26
4 files changed, 69 insertions, 0 deletions
diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs
index 686d09dd7fc..46138df07bf 100644
--- a/compiler/rustc_lint_defs/src/builtin.rs
+++ b/compiler/rustc_lint_defs/src/builtin.rs
@@ -1080,6 +1080,7 @@ declare_lint! {
     pub UNALIGNED_REFERENCES,
     Allow,
     "detects unaligned references to fields of packed structs",
+    report_in_external_macro
 }
 
 declare_lint! {
diff --git a/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs b/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs
new file mode 100644
index 00000000000..fb486c6b59a
--- /dev/null
+++ b/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs
@@ -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;
+                )+
+            }
+        };
+    };
+}
diff --git a/src/test/ui/lint/unaligned_references_external_macro.rs b/src/test/ui/lint/unaligned_references_external_macro.rs
new file mode 100644
index 00000000000..6ac501fb0e0
--- /dev/null
+++ b/src/test/ui/lint/unaligned_references_external_macro.rs
@@ -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() {}
diff --git a/src/test/ui/lint/unaligned_references_external_macro.stderr b/src/test/ui/lint/unaligned_references_external_macro.stderr
new file mode 100644
index 00000000000..140294b65cc
--- /dev/null
+++ b/src/test/ui/lint/unaligned_references_external_macro.stderr
@@ -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
+