http://d.puremagic.com/issues/show_bug.cgi?id=3398
--- Comment #3 from Don <clugd...@yahoo.com.au> 2010-06-09 00:31:56 PDT --- PATCH: Currently, after processing every field, sc->offset gets changed, and StructDeclaration::semantic() sets the offset back to zero if it was a union. This patch moves the processing to AggregateDeclaration::addField() instead. If it's a union, don't change the offset in the first place. Index: struct.c =================================================================== --- struct.c (revision 527) +++ struct.c (working copy) @@ -194,20 +194,23 @@ sizeok = 2; // cannot finish; flag as forward referenced return; } + size_t ofs = sc->offset; memsize = t->size(loc); memalignsize = t->alignsize(); xalign = t->memalign(sc->structalign); - alignmember(xalign, memalignsize, &sc->offset); - v->offset = sc->offset; - sc->offset += memsize; - if (sc->offset > structsize) - structsize = sc->offset; + alignmember(xalign, memalignsize, &ofs); + v->offset = ofs; + ofs += memsize; + if (ofs > structsize) + structsize = ofs; if (sc->structalign < memalignsize) memalignsize = sc->structalign; if (alignsize < memalignsize) alignsize = memalignsize; //printf("\talignsize = %d\n", alignsize); + if (!isUnionDeclaration()) + sc->offset = ofs; v->storage_class |= STCfield; //printf(" addField '%s' to '%s' at offset %d, size = %d\n", v->toChars(), toChars(), v->offset, memsize); @@ -386,8 +389,6 @@ { Dsymbol *s = (Dsymbol *)members->data[i]; s->semantic(sc2); - if (isUnionDeclaration()) - sc2->offset = 0; #if 0 if (sizeok == 2) { //printf("forward reference\n"); -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------