[Issue 21301] Wrong values being passed in long parameter list

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 2 12:18:15 UTC 2022


https://issues.dlang.org/show_bug.cgi?id=21301

--- Comment #3 from Dennis <dkorpel at live.nl> ---
Here's a bit more test code, reducing it to only using int and float, and using
hex values as arguments that are easy to identify:

```
import core.stdc.stdio;

union U
{
    int[22] i = [
        0xAAAA_0000,
        0xAAAA_0001,
        0xAAAA_0002,
        0xAAAA_0003,
        0xFFFF_0004,
        0xFFFF_0005,
        0xFFFF_0006,
        0xFFFF_0007,
        0xFFFF_0008,
        0xFFFF_0009,
        0xFFFF_0010,
        0xFFFF_0011,
        0xFFFF_0012,
        0xFFFF_0013,
        0xFFFF_0014,
        0xFFFF_0015,
        0xAAAA_0016,
        0xAAAA_0017,
        0xAAAA_0018,
        0xAAAA_0019,
        0xAAAA_0020,
        0xAAAA_0021,
    ];

    float[22] f;
}

void print(int x) { printf("int   %08X\n", x); }
void print(float x) { printf("float %08X\n", *(cast(int*) &x)); }

void main()
{
    void func(
        int p0, int[3] p1, float[3] p2, float p3, float p4, float p5, float p6,
float p7,
        float p8, float p9, float p10, float p11, int p12, int[2] p13, int p14,
int p15, int p16
    ) {
        print(p0);
        print(p1[0]);
        print(p1[1]);
        print(p1[2]);
        print(p2[0]);
        print(p2[1]);
        print(p2[2]);
        print(p3);
        print(p4);
        print(p5);
        print(p6);
        print(p7);
        print(p8);
        print(p9);
        print(p10);
        print(p11);
        print(p12);
        print(p13[0]);
        print(p13[1]);
        print(p14);
        print(p15);
        print(p16);
    }

    func(U.init.i[0], [U.init.i[1], U.init.i[2], U.init.i[3]], [U.init.f[4],
U.init.f[5], U.init.f[6]],
        U.init.f[7], U.init.f[8], U.init.f[9], U.init.f[10], U.init.f[11],
U.init.f[12], U.init.f[13],
        U.init.f[14], U.init.f[15], U.init.i[16], [U.init.i[17], U.init.i[18]],
U.init.i[19], U.init.i[20], U.init.i[21]
    );
}
```

Expected / ldc output:
```
int   AAAA0000
int   AAAA0001
int   AAAA0002
int   AAAA0003
float FFFF0004
float FFFF0005
float FFFF0006
float FFFF0007
float FFFF0008
float FFFF0009
float FFFF0010
float FFFF0011
float FFFF0012
float FFFF0013
float FFFF0014
float FFFF0015
int   AAAA0016
int   AAAA0017
int   AAAA0018
int   AAAA0019
int   AAAA0020
int   AAAA0021
```

DMD output:
```
int   AAAA0003
int   FFFF0006
int   00007FFE
int   AAAA0001
float EA9E9130
float 00007FFE
float FFFF0004
float FFFF0007
float FFFF0008
float FFFF0009
float FFFF0010
float FFFF0011
float FFFF0012
float FFFF0013
float FFFF0014
float FFFF0015
int   AAAA0016
int   AAAA0017
int   AAAA0018
int   AAAA0019
int   AAAA0020
int   AAAA0021
```

So it's the first 7 arguments which are garbage or reading from another
parameter.

--


More information about the Digitalmars-d-bugs mailing list