www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 18274] New: va_arg (TypeInfo) broken for static arrays


          Issue ID: 18274
           Summary: va_arg (TypeInfo) broken for static arrays
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: druntime
          Assignee: nobody puremagic.com
          Reporter: johannespfau gmail.com

This code is currently broken:

void foo(...)
    uint[4] data;
    va_arg(_argptr, _arguments[0], &data);
    //data = va_arg!(uint[4])(_argptr);

void main()
    uint[4] value = [1, 2, 3, 4];
[4, 0, 3567405808, 32767]

The commented, static variant works. The problem is that DMD passes static
arrays as {.ptr, .length} slice with TypeInfo_Tuple for D variadic functions.
va_arg would have to detect this and instead of just copying the data it has to
dereference the pointer. I'm not sure if this is easily possible though: DMD
passes TypeInfo_Tuple instead of TypeInfo_StaticArray. Can TypeInfo_Tuple only
occur for static arrays? If so, fixing this is easy. If not, we have to pass
proper TypeInfo for static array parameters.

I don't know why we even do this, at least on AArch64 we can have much better
performance by just passing static arrays by value in the same way a struct
would be passed. Passing as ptr+length requires another special case in the
va_arg function for static arrays.

Jan 21 2018