mirror of
https://github.com/cc65/cc65.git
synced 2024-08-29 09:29:19 +00:00
112 lines
2.2 KiB
C
112 lines
2.2 KiB
C
|
/*
|
||
|
!!DESCRIPTION!! Make sure that structs/unions know the sizes of anonymous struct/union members
|
||
|
!!ORIGIN!! cc65 regression tests
|
||
|
!!LICENCE!! Public Domain
|
||
|
!!AUTHOR!! Greg King
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
see https://github.com/cc65/cc65/issues/641
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
|
||
|
static unsigned char fails = 0;
|
||
|
|
||
|
typedef struct {
|
||
|
short s1;
|
||
|
struct {
|
||
|
int i1;
|
||
|
long l1;
|
||
|
char c1;
|
||
|
};
|
||
|
char c2;
|
||
|
} s1_t;
|
||
|
|
||
|
typedef struct {
|
||
|
short s1;
|
||
|
union {
|
||
|
int i1;
|
||
|
long l1;
|
||
|
char c1;
|
||
|
};
|
||
|
char c2;
|
||
|
} s2_t;
|
||
|
|
||
|
typedef union {
|
||
|
short s1;
|
||
|
struct {
|
||
|
int i1;
|
||
|
long l1;
|
||
|
char c1;
|
||
|
};
|
||
|
char c2;
|
||
|
} u1_t;
|
||
|
|
||
|
typedef union {
|
||
|
short s1;
|
||
|
union {
|
||
|
int i1;
|
||
|
long l1;
|
||
|
char c1;
|
||
|
};
|
||
|
char c2;
|
||
|
} u2_t;
|
||
|
|
||
|
static s1_t s1;
|
||
|
static s2_t s2;
|
||
|
static u1_t u1;
|
||
|
static u2_t u2;
|
||
|
|
||
|
/* We use "variables" in the comparisons, so that we can avoid "constant
|
||
|
** comparison" and "Unreachable code" warnings (the second one currently
|
||
|
** can't be suppressed).
|
||
|
*/
|
||
|
|
||
|
static size_t const four = 4;
|
||
|
static size_t const seven = 7;
|
||
|
static size_t const ten = 10;
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
/* Check the types' sizes. */
|
||
|
|
||
|
if (sizeof (s1_t) != ten) {
|
||
|
printf("s1_t size is %u; it should be 10.\n", sizeof (s1_t));
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof (s2_t) != seven) {
|
||
|
printf("s2_t size is %u; it should be 7.\n", sizeof (s2_t));
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof (u1_t) != seven) {
|
||
|
printf("u1_t size is %u; it should be 7.\n", sizeof (u1_t));
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof (u2_t) != four) {
|
||
|
printf("u2_t size is %u; it should be 4.\n", sizeof (u2_t));
|
||
|
++fails;
|
||
|
}
|
||
|
|
||
|
/* Check the variables' sizes. */
|
||
|
|
||
|
if (sizeof s1 != ten) {
|
||
|
printf("s1 size is %u; it should be 10.\n", sizeof s1);
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof s2 != seven) {
|
||
|
printf("s2 size is %u; it should be 7.\n", sizeof s2);
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof u1 != seven) {
|
||
|
printf("u1 size is %u; it should be 7.\n", sizeof u1);
|
||
|
++fails;
|
||
|
}
|
||
|
if (sizeof u2 != four) {
|
||
|
printf("u2 size is %u; it should be 4.\n", sizeof u2);
|
||
|
++fails;
|
||
|
}
|
||
|
|
||
|
return fails;
|
||
|
}
|