about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/hir-def/src/data/adt.rs2
-rw-r--r--crates/hir-ty/src/layout/tests.rs30
2 files changed, 31 insertions, 1 deletions
diff --git a/crates/hir-def/src/data/adt.rs b/crates/hir-def/src/data/adt.rs
index b163112db91..a95b78614e8 100644
--- a/crates/hir-def/src/data/adt.rs
+++ b/crates/hir-def/src/data/adt.rs
@@ -128,7 +128,7 @@ fn parse_repr_tt(tt: &Subtree) -> Option<ReprOptions> {
                     } else {
                         0
                     };
-                    let pack = Align::from_bytes(pack).unwrap();
+                    let pack = Align::from_bytes(pack).unwrap_or(Align::ONE);
                     min_pack =
                         Some(if let Some(min_pack) = min_pack { min_pack.min(pack) } else { pack });
                     ReprFlags::empty()
diff --git a/crates/hir-ty/src/layout/tests.rs b/crates/hir-ty/src/layout/tests.rs
index 9937113685c..ef0be7ab2da 100644
--- a/crates/hir-ty/src/layout/tests.rs
+++ b/crates/hir-ty/src/layout/tests.rs
@@ -221,6 +221,36 @@ fn recursive() {
 }
 
 #[test]
+fn repr_packed() {
+    size_and_align! {
+        #[repr(packed)]
+        struct Goal;
+    }
+    size_and_align! {
+        #[repr(packed(2))]
+        struct Goal;
+    }
+    size_and_align! {
+        #[repr(packed(4))]
+        struct Goal;
+    }
+    size_and_align! {
+        #[repr(packed)]
+        struct Goal(i32);
+    }
+    size_and_align! {
+        #[repr(packed(2))]
+        struct Goal(i32);
+    }
+    size_and_align! {
+        #[repr(packed(4))]
+        struct Goal(i32);
+    }
+
+    check_size_and_align("#[repr(packed(5))] struct Goal(i32);", "", 4, 1);
+}
+
+#[test]
 fn generic() {
     size_and_align! {
         struct Pair<A, B>(A, B);