Struct literals bug ?

John Colvin john.loughran.colvin at gmail.com
Sun Sep 29 11:29:20 PDT 2013


On Sunday, 29 September 2013 at 18:01:01 UTC, monarch_dodra wrote:
> On Sunday, 29 September 2013 at 17:35:33 UTC, andrea9940 wrote:
>> Thanks for the answer, I  will use the aliases; however I just 
>> tried my code on codepad and surprising it worked without 
>> errors http://codepad.org/hp0YxIi7
>
> I think there is a bug in there somewhere though:
>
> //----
> struct V{
>     union {
>         struct {
>             float x = 0;
>             float y = 0;
>         }
>         struct {
>             float r;
>             float g;
>         }
>     }
> }
>
> void main() {
>     assert(V.init.x == 0 && V.init.y == 0); //Passes
>     V v1 = V.init;
>     assert(v1 is V.init); //Passes
>     V v2 = V(); // OR simply use: V v2;
>     assert(v2 is V.init); //Fails
> }
> //----
>
> That just isn't right. "T.init" and "T()" is supposed to be 
> equivalent (bar static opCall).
>
> Also, I'm 99% confident that when initializing a union, the 
> first member (in this case, the struct), is the one that gets 
> initialized. *fully* initialized.
>
> So my conclusion is that there is something wrong in the 
> construction sequence/defintion, and that this bug is 
> definitely valid.

Definitely something very wrong:

struct V
{
     union
     {
         struct
	{
             float x = 0;
             float y = 0;
	    int a = 3;
         }
         struct
	{
             float r;
             float g;
	    int d;
         }
     }
}

import std.stdio;

void main()
{
     writeln("V(", V.init.x, ", ", V.init.y, ", ", V.init.a, ", ", 
V.init.r, ", ", V.init.g, ", ", V.init.d, ")");
     writeln(V.init);
     writeln(V(V.init.x, V.init.y, V.init.a));
}

V(0, 0, 3, 0, 0, 3)
V(0, nan, 0, 0, nan, 0)
V(0, 0, 3, 0, 0, 3)

WAT???


More information about the Digitalmars-d-learn mailing list