[Issue 19903] New: postblit called for uninitialised elements of unions

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun May 26 17:14:34 UTC 2019


          Issue ID: 19903
           Summary: postblit called for uninitialised elements of unions
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: turkeyman at gmail.com

import std.stdio;

    struct T
        this(this) { writeln("dun postblit\n"); }
        float f = 0;

    struct S
        union {
            int x = 0;
            T y = void; // <- void initialised
        int which = 0;

    S a;
    S b = a; // <- assignment calls postblit

This assignment calls the T postblit, which is a `void` initialised member of a
This is just a hard crash waiting to happen!

This pattern should be supplanted with copy-ctors.
I suggest a reasonable resolution is:
  1. no such implicit non-trivial assignment is attempted inside a union
  2. if a union contains an element with a non-trivial copy, then a copy-ctor
must be defined otherwise user receives a compile error informing them such.
    2a. perhaps rather than emitting a compile error, it might be better to
emit an automatic @disable copy constructor for that object.

I think it's the case that any union with elaborate copy semantics can only be
correctly composed by the author of the union.


More information about the Digitalmars-d-bugs mailing list