From 626c0a5ab70f4f79f970157656fa00fc1fd3e722 Mon Sep 17 00:00:00 2001 From: Tim Schendekehl Date: Fri, 30 Aug 2024 17:45:47 +0200 Subject: [PATCH] Fix bugzilla 24733 - ImportC: `#pragma pack(pop)` restores wrong alignment --- compiler/src/dmd/cparse.d | 2 +- compiler/test/compilable/test24733.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 compiler/test/compilable/test24733.c diff --git a/compiler/src/dmd/cparse.d b/compiler/src/dmd/cparse.d index 70de6af0da5..e02ff43097b 100644 --- a/compiler/src/dmd/cparse.d +++ b/compiler/src/dmd/cparse.d @@ -5813,7 +5813,7 @@ final class CParser(AST) : Parser!AST if (len == 1) // stack is now empty packalign.setDefault(); else - packalign = (*this.packs)[len - 1]; + packalign = (*this.packs)[len - 2]; return closingParen(); } while (n.value == TOK.comma) // #pragma pack ( pop , diff --git a/compiler/test/compilable/test24733.c b/compiler/test/compilable/test24733.c new file mode 100644 index 00000000000..84a07850ce1 --- /dev/null +++ b/compiler/test/compilable/test24733.c @@ -0,0 +1,21 @@ +struct S1 {unsigned char c;int i;}; +#pragma pack(push, 2) +struct S2 {unsigned char c;int i;}; +#pragma pack(push, 1) +struct S3 {unsigned char c;int i;}; +#pragma pack(pop) +struct S4 {unsigned char c;int i;}; +#pragma pack(pop) +struct S5 {unsigned char c;int i;}; + +_Static_assert(_Alignof(struct S1) == 4, "alignof S1"); +_Static_assert(_Alignof(struct S2) == 2, "alignof S2"); +_Static_assert(_Alignof(struct S3) == 1, "alignof S3"); +_Static_assert(_Alignof(struct S4) == 2, "alignof S4"); +_Static_assert(_Alignof(struct S5) == 4, "alignof S5"); + +_Static_assert(sizeof(struct S1) == 8, "sizeof S1"); +_Static_assert(sizeof(struct S2) == 6, "sizeof S2"); +_Static_assert(sizeof(struct S3) == 5, "sizeof S3"); +_Static_assert(sizeof(struct S4) == 6, "sizeof S4"); +_Static_assert(sizeof(struct S5) == 8, "sizeof S5");