http://d.puremagic.com/issues/show_bug.cgi?id=7444
Summary: Require [] for array copies too Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: bearophile_h...@eml.cc --- Comment #0 from bearophile_h...@eml.cc 2012-02-05 11:10:57 PST --- This is derived from issue 3971 see there for more (messy) discussions. In 2.058 this compiles: int[100] foo() { int[100] a; return a; } void main() { int[10_000] a, b; auto c = new int[10_000]; a = 1; a = b; a = c; auto d = foo(); } But for consistency of the vector ops syntax, and to help the programmer spot where the code is doing a potentially long copy, I suggest to turn that first program into a compile-time error, and require [] on lvalues everywhere you perform a vector operation, like when you copy a int[N] on another int[N], etc: int[100] foo() { int[100] a; return a; } void main() { int[10_000] a, b; auto c = new int[10_000]; a[] = 1; a[] = b; a[] = c; auto d[] = foo(); // currently an error } - - - - - - - - - - - - - - - - But note that normally all array ops require a [] even on the rvalue: void main() { int[10_000] a, b; a[] += b[]; } So an alternative stricter proposal is to require [] on the right too: int[100] foo() { int[100] a; return a; } void main() { int[10_000] a, b; auto c = new int[10_000]; auto d = new int[10_000]; a[] = 1; a[] = b[]; a[] = c[]; c[] = d[]; auto e[] = foo()[]; // currently an error } It helps the programmer tell apart two different cases, that currently are usable with the same syntax (from an example by Don): void main() { int[][3] x; int[] y; int[] z; x[] = z; // copies just the z pointer y[] = z; // copies the elements in z } Requiring [] on the right (rvalue) for the copy of many items avoids the ambiguity: void main() { int[][3] x; int[] y; int[] z; x[] = z; y[] = z[]; } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------