is this an instance of the 16-byte struct bug

jerro a at a.com
Mon Nov 4 15:14:07 PST 2013


On Monday, 4 November 2013 at 23:07:27 UTC, deadalnix wrote:
> On Monday, 4 November 2013 at 22:56:48 UTC, jerro wrote:
>>> Then it look like a dmd backend bug. Can you post the 
>>> generated assembly ?
>>
>> 000000000043050c <_Dmain>:
>>   43050c:       push   %rbp
>>   43050d:       mov    %rsp,%rbp
>>   430510:       sub    $0x40,%rsp
>>   430514:       movabs $0x3ff0000000000000,%rax
>>   43051b:
>>   43051e:       mov    %rax,-0x40(%rbp)
>>   430522:       movsd  -0x40(%rbp),%xmm0
>>   430527:       rex.W movsd %xmm0,-0x30(%rbp)
>>   43052d:       xor    %edx,%edx
>>   43052f:       mov    %rax,-0x10(%rbp)
>>   430533:       mov    %rdx,-0x8(%rbp)
>>   430537:       mov    %rax,-0x28(%rbp)
>>   43053b:       mov    %rdx,-0x20(%rbp)
>
>>   43053f:       mov    0x28022(%rip),%rdx
>>   430546:       mov    0x28013(%rip),%rsi
>
> What are these ? What are they referering to

My guess is they are refering to length and
ptr for "%x" string literal, which is passed to writefln.

>
>>   43054d:       mov    -0x28(%rbp),%rdi
>>   430551:       callq  430874 <void
>> std.stdio.writefln!(immutable(char)[],
>> ulong).writefln(immutable(char)[], ulong)>
>>   430556:       xor    %eax,%eax
>>   430558:       leaveq
>>   430559:       retq
>
> This calls writefln, this is not what your code does just 
> above. Are you sure you are posting the right assembly ? Do you 
> use the inline flag ?

I think you are confusing my post with some other post (I am not
OP).
My code sample was:

import std.stdio;

struct Y {
       int[] _data;
}

struct CFS {
       double x;
       Y growth;
}

void main() {
       auto s = CFS(1.0);
       writefln("%x", s.growth._data.length); // prints
3ff0000000000000
}

The constructor's argument was 2.0 in my previous sample, but it
should have been 1.0.


More information about the Digitalmars-d mailing list