[Issue 19150] New: Union member assignment causes invalid destructor call in @safe code

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Aug 8 18:53:29 UTC 2018


https://issues.dlang.org/show_bug.cgi?id=19150

          Issue ID: 19150
           Summary: Union member assignment causes invalid destructor call
                    in @safe code
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: snarwin+bugzilla at gmail.com

The following code compiles without errors and produces an erroneous call to
HasDtor's destructor:

---
struct HasDtor
{
    int n;

    ~this() @safe
    {
        import std.stdio: writeln;
        writeln("Called destructor with n = ", n);
    }
}

union U
{
    float n;
    HasDtor h;
}

@safe void main()
{
    U u = { n : 1 };
    u.h = HasDtor(2);
}
---

Output:
Called destructor with n = 1065353216

Because there is no way to know at compile time whether the union member being
assigned to is valid, assignment to a member of a union that includes any
members with destructors should be forbidden in @safe code.

In addition, since the language must rely on the programmer to manually destroy
the appropriate union member in @system code, the automatic destructor call is
at best redundant and at worst undefined behavior. Therefore, it should be
omitted.

--


More information about the Digitalmars-d-bugs mailing list