Unnamed repository; edit this file 'description' to name the repository.
-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 b163112db9..a95b78614e 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 9937113685..ef0be7ab2d 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);