Valid to assign to field of struct in union?
Timon Gehr via Digitalmars-d
digitalmars-d at puremagic.com
Tue Sep 6 10:58:44 PDT 2016
On 06.09.2016 14:56, Johan Engelen wrote:
> Hi all,
> I have a question about the validity of this code:
> ```
> void main()
> {
> struct A {
> int i;
> }
> struct S
> {
> union U
> {
> A first;
> A second;
> }
> U u;
>
> this(A val)
> {
> u.second = val;
> assign(val);
> }
>
> void assign(A val)
> {
> u.first.i = val.i+1;
> }
> }
> enum a = S(A(1));
>
> assert(a.u.first.i == 2);
> }
> ```
>
> My question is: is it allowed to assign to a field of a struct inside a
> union, without there having been an assignment to the (full) struct before?
> ...
I don't think so (although your case could be made to work easily
enough). This seems to be accepts-invalid. Another case, perhaps
demonstrating more clearly what is going on in the compiler:
float foo(){
union U{
int a;
float b;
}
U u;
u.b=1234;
u.a=3;
return u.b; // error
}
pragma(msg, foo());
float bar(){
struct A{ int a; }
struct B{ float b; }
union U{
A f;
B s;
}
U u;
u.s.b=1234;
u.f.a=0;
return u.s.b; // ok
}
pragma(msg, bar()); // 1234.00F
> The compiler allows it, but it leads to a bug with CTFE of this code:
> the assert fails.
> (changing `enum` to `auto` moves the evaluation to runtime, and all
> works fine)
>
> Reported here: https://issues.dlang.org/show_bug.cgi?id=16471.
>
More information about the Digitalmars-d
mailing list