Deprecate assigning a slice to a static array?

Nick Treleaven nick at geany.org
Wed Aug 31 12:04:10 UTC 2022


I didn't know initializing a static array from a slice of unknown 
length was allowed until I saw:
https://dlang.org/blog/2022/06/21/dip1000-memory-safety-in-a-modern-system-programming-language-pt-1/

     // allocated in static program memory
     auto hello1 = "Hello world!";
     // allocated on the stack, copied from hello1
     immutable(char)[12] hello2 = hello1;

How does the compiler know `hello1.length` at compile-time for 
the initialisation of the static array? It doesn't - there is a 
runtime check. I think it's better to require slicing of either 
the static array or the slice to make that clear:

     int[] s = ...;
     int[2] a;
     a[] = s; // copy slice to slice, checking lengths match
     a = s[0..2]; // copy 2 elements, no runtime check

(The last line is recognised as a slice of compile-time known 
length - described here:
https://dlang.org/spec/expression.html#slice_to_static_array).

For just `a = s;`, the programmer may have accidentally assumed 
`s` was a static array, or forgot to slice it to match the static 
array size. I think it's bug prone. It's also hard to detect if 
the slice normally has a matching length but in some weird 
runtime condition it doesn't and it throws. It's also a hidden 
runtime check that could hurt performance.

Note this doesn't seem to be documented in the spec yet:
[1] https://dlang.org/spec/arrays.html#assignment
[2] https://dlang.org/spec/arrays.html#array-copying
[3] https://dlang.org/spec/arrays.html#array-initialization

[1] actually has:

     //s = a; // error, as a's length is not known at compile-time

I added that to the docs but it's wrong (if this feature is to 
stay I will make a PR to fix that line).

[2] only talks about slices. [3] doesn't mention initializing 
from an lvalue. *AssignExpression* just links to Array Copying 
[2] and Array Setting (for assigning a single element).

Would deprecating this break much code? Perhaps an exploratory 
dmd PR could be made to see if it breaks any of the tested key 
projects?



More information about the Digitalmars-d mailing list