[Issue 3398] Attributes inside a union screws data alignment

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Apr 21 01:14:16 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3398


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug at yahoo.com.au
            Summary|Version block inside a      |Attributes inside a union
                   |union screws data alignment |screws data alignment
           Severity|normal                      |critical


--- Comment #1 from Don <clugdbug at yahoo.com.au> 2010-04-21 01:14:12 PDT ---
This applies not just to version declarations; it applies to any attribute.

union Foo1 {
    double[2] a;
    double[2] b;        
}

union Foo2 {
public:
     double[2] a;
     double[2] b;        
}

static assert(Foo1.sizeof == Foo2.sizeof);
---
bug.d(32): Error: static assert  (16u == 32u) is false

Subtle and disastrous bug (especially when dealing with C libraries),
escalating severity.

Here's a mitigation to create an error message, rather than generate wrong
code.

MITIGATION: struct.c StructDeclaration::semantic() line 384.
The problem is that AttribDeclaration::semantic has it's own loop for
doing the semantic on members, which does NOT include setting the offset to 0
if it's a union. Fixing this would not be difficult, but would require a minor
structural change in the compiler.

---

    for (int i = 0; i < members_dim; i++)
    {
        Dsymbol *s = (Dsymbol *)members->data[i];
+        if (isUnionDeclaration() && s->isAttribDeclaration())
+            error("Attributes don't yet work inside unions, see Bugzilla
3398");
        s->semantic(sc2);
        if (isUnionDeclaration())
            sc2->offset = 0;
-------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list