Union redux

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Mon Jun 1 12:43:41 PDT 2015


On 6/1/15 12:00 PM, deadalnix wrote:
> 1/ .init for unions is not defined. I propose to define it as the .init
> of the first field + padding with 0s if the union is larger than its
> first member. It seems to be what is generated right now.

Fine.

> 2/ Default constructor takes one argument per union's field and assign
> them all one over the other. This does not make any sense and need to be
> changed. Proposed solutions :
>   a. Define one constructor for the first field.
>   b. Define N constructors, one per field.
>   c. Do not define constructors.
>
> My preference goes for b, then a, then c, in that order.

Do not define constructors. They ostensibly imply commitment to 
remembering to call the appropriate destructor. A union can only be 
default constructed (with its init value as described) and has no 
destructor.

> 3/ union and @safe is currently undefined. I proposed to make everything
> involving unions @system, and we will figure it out from there. At the
> very least, all union with indirections and fields having a
> posblit/destructor ust be @system.

A good first step. Let's.

> 4/ tupleof for unions generate a tuple will all field of the union. It
> does not make much sense, and it is unclear if tupleof can make sense at
> all on a union. Let's not have tupleof on union at all.

tupleof must generate a tuple recognizable by introspection engines. I 
therefore thing tupleof with all members is the only approach that 
doesn't lose information. Introspection engines can check is(X == union) 
prior to interpreting tupleof.

> 5/ union currently disallow members with postblit and/or destructor . It
> seems that this was needed in C++ as per Andrei's comments. It seems to
> me that, because of manual memory management, C++ would have a lot more
> struct with copy constructor and/or destructor than in D, so I'm not
> sure if this require change in spec. Andrei, can you give more details
> on the C++ situation here ?

That rule has hurt C++ everywhere, and the community credits Lois 
Goldthwaite for pushing the current rule, which allows types with cdtors 
in unions. Let's go the same way, unions are all but useless otherwise.

> 6/ struct with anonymous union in them define one parameter per union
> field in the default constructor. This should probably lead to the same
> solution as 2/

Structs can have auto-defined ctors only up to the union member.

> 7/ struct with anonymous union in them have one entry per union field in
> their tupleof. All the union field should be present as one entry in the
> tupleof, with a compiler generated union type.

Again the litmus test here is enabling introspection. Structs with 
anonymous union members should have one member called e.g. __anonymous__ 
in their tupleof, and in turn introspecting that member should list its 
tuple.

> 8/ unions and structs are mangled the same way (or so it seems). Bug or
> feature ?

Not sure. Walter?

> 9/ union alignement is not specified. union align should be least common
> multiple of union's fields.

Yes. Since they're all powers of 2, taking the max is the same thing. 
BTW, to my surprise on OSX real.alignof is 16, but the alignof a union 
containing a real is 8. I think that's a bug. Please verify and file.

> 10/ union that capture a closure are undefined. I think that right now,
> they just add the context pointer at the same address as other fields,
> which is nonsensical. Proposal :
>   a. Add the context at an address that do not overlap with other fields.
>   b. Do not allow union to capture a context.

No context please. We may add it later.

I'd say check the existing semantics, file bug reports, and make PRs for 
a section on unions in the language reference that links to the issues 
wherever the actual behavior is not in sync with the spec.


Andrei



More information about the Digitalmars-d mailing list