diff options
| author | grischka <grischka> | 2009-06-17 02:09:07 +0200 |
|---|---|---|
| committer | grischka <grischka> | 2009-06-17 02:09:07 +0200 |
| commit | 69fdb57eddd00c592828605819f0678522d346c6 (patch) | |
| tree | dcca669d72e59ee4168fbf15f5651538c77071ae | |
| parent | bba515afe5496ee59fc10c3307577a87c94fb87f (diff) | |
| download | tinycc-69fdb57eddd00c592828605819f0678522d346c6.tar.gz tinycc-69fdb57eddd00c592828605819f0678522d346c6.tar.bz2 | |
unions: initzialize only one field
struct {
union {
int a,b;
};
int c;
} sss = { 1,2 };
This had previously assigned 1,2 to a,b and 0 to c which is wrong.
| -rw-r--r-- | tccgen.c | 18 |
1 files changed, 18 insertions, 0 deletions
@@ -4530,6 +4530,24 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c, index = index + type_size(&f->type, &align1); if (index > array_length) array_length = index; + + /* gr: skip fields from same union - ugly. */ + while (f->next) { + ///printf("index: %2d %08x -- %2d %08x\n", f->c, f->type.t, f->next->c, f->next->type.t); + /* test for same offset */ + if (f->next->c != f->c) + break; + /* if yes, test for bitfield shift */ + if ((f->type.t & VT_BITFIELD) && (f->next->type.t & VT_BITFIELD)) { + int bit_pos_1 = (f->type.t >> VT_STRUCT_SHIFT) & 0x3f; + int bit_pos_2 = (f->next->type.t >> VT_STRUCT_SHIFT) & 0x3f; + //printf("bitfield %d %d\n", bit_pos_1, bit_pos_2); + if (bit_pos_1 != bit_pos_2) + break; + } + f = f->next; + } + f = f->next; if (no_oblock && f == NULL) break; |
