blob: 10273b2ba27ff4d5978eebb5f4fef102118a887a [file] [log] [blame]
/* APPLE LOCAL file 4163069 */
/* Test semantics of #pragma pack.
Contributed by Mike Stump <mrs@apple.com> */
/* { dg-do run { target *-*-darwin* } } */
#include <stdio.h>
#pragma pack(push, 1)
struct
{
int a;
short b;
} ShouldBeSixBytes;
#pragma pack(push, 8)
struct
{
int a;
short b;
} ShouldBeEightBytes;
/* Does a "push" in Apple's standard GCC, should here, too. */
#pragma pack(push, 4)
struct
{
char a;
short b;
} ShouldBeFourBytes;
/* Should be popped back to eight bytes. */
#pragma pack()
struct
{
int a;
short b;
} ShouldBeEightBytesToo;
/* Should be popped back to one byte packing. */
#pragma pack(pop)
struct
{
char a;
char b;
char c;
} ShouldBeThreeBytes;
/* pop to native packing. */
#pragma pack(pop)
struct
{
char a;
short b;
} ShouldBeFourBytesToo; /* (well, four bytes on 32-bit PowerPC. YMMV.) */
int nerrs = 0;
static void
dotest (const char *name, int trueOrFalse)
{
if (! trueOrFalse)
++nerrs;
printf ("test %s: %s\n", name, trueOrFalse ? "passed" : "failed");
}
int main(void)
{
dotest ("push 1", sizeof (ShouldBeSixBytes) == 6);
dotest ("push 8", sizeof (ShouldBeEightBytes) == 8);
dotest ("push 4", sizeof (ShouldBeFourBytes) == 4);
dotest (" pop 8", sizeof (ShouldBeEightBytesToo) == 8);
dotest (" pop 1", sizeof (ShouldBeThreeBytes) == 3);
dotest (" pop n", sizeof (ShouldBeFourBytesToo) == 4);
return nerrs;
}