[Issue 20472] New: [REG 2.068] slicing a static array results in another static array
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Dec 30 18:16:15 UTC 2019
https://issues.dlang.org/show_bug.cgi?id=20472
Issue ID: 20472
Summary: [REG 2.068] slicing a static array results in another
static array
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Keywords: wrong-code
Severity: regression
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: schveiguy at yahoo.com
If I slice a static array, the type should be a dynamic array:
int[16] x;
pragma(msg, typeof(x[])); // int[]
auto y = x[];
pragma(msg, typeof(y)); // int[]
However, if you slice a static array, and call a template or regular function
which accepts a static array that matches the slice size, for some reason the
compiler turns it into a static array again:
import std.stdio;
void foo(size_t N)(int[N] arr)
{
writeln("static: ", N);
}
void foo()(int[] arr)
{
writeln("dynamic");
}
void main()
{
int[16] x;
foo(x); // static 16
foo(x[]); // static 16
foo(x[0 .. 5]); // static 5 (!)
auto y = x[];
foo(y); // dynamic
}
Note the only way to solve this is to create a new variable. The resulting
output should be:
static 16
dynamic
dynamic
dynamic
The end result means workarounds for ensuring you pass a slice and not the
entire static array can be overridden by the compiler. This is related to issue
16519, as there's no easy workaround.
run.dlang.io seems to suggest it happened in 2.068.2, someone on the forums
suggested PR https://github.com/dlang/dmd/pull/4779
Conversation on forums:
https://forum.dlang.org/post/qud5mk$2h9q$1@digitalmars.com
--
More information about the Digitalmars-d-bugs
mailing list