Comment #0 by iamthewilsonator — 2019-06-11T14:04:23Z
short test27(int (& const arr)[6][291]) { return 0;};
with MSVC gives warning C4227: anachronism used: qualifiers on reference are ignored
and hence mangles as
?test27@@YAFAE_A_Y15BCD@H@Z (without the underscores, A being mutable)
whereas DMD mangles
extern(C++) short test27(const ref int[291][6] t);
as
?test27@@YAFAE_B_Y15BCD@H@Z (without the underscores, B being const).
Comment #1 by kinke — 2019-06-11T16:51:18Z
The `const` in the D signature doesn't apply to the reference itself, but to the type, i.e., is the same as `ref const(int[291][6])`, and as such your C++ example isn't an analogon.
Proper analogon with a 1D array, showing that the problem goes somewhat deeper:
C++: short test27(const int (&)[291]);
Win64 mangle: ?test27@@YAFAEAY0BCD@$$CBH@Z
D: extern(C++) short test27(const ref int[291])
Win64 mangle: ?test27@@YAFAEBY0BCD@H@Z
Comment #2 by kinke — 2019-06-11T19:18:43Z
Related issue for Linux x64:
C++: short test27(const int (&)[6][291])
_Z6test27RA6_A291_Ki
D: extern(C++) short test27(ref const int[291][6])
_Z6test27RKA6_KA291_Ki
Note that the C++ mangling of `const(int[291][6])` and `const(int)[291][6]` is identical for both MSVC and Itanium (and that's fine IMO).
Comment #3 by robert.schadek — 2024-12-13T19:03:52Z