Bug 6934 – [CTFE] can't use $ in a slice of an array passed by ref

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2011-11-11T19:41:00Z
Last change time
2015-06-09T05:11:43Z
Keywords
rejects-valid
Assigned to
nobody
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2011-11-11T19:41:18Z
It seems transversal() can't run at compile-time: import std.range: transversal; int foo() { auto M = [[1,2], [3,4]]; foreach (x; transversal(M, 0)) {} return 0; } enum _ = foo(); void main() {} DMD 2.057head gives: ...\dmd2\src\phobos\std\array.d(328): Error: Cannot determine length of Transversal([[1,2],[3,4]],0u)._input at compile time ...\dmd2\src\phobos\std\range.d(4648): called from here: popFront(this._input) test.d(4): called from here: __r1.popFront() test.d(7): called from here: foo()
Comment #1 by clugdbug — 2011-11-19T00:03:47Z
Reduced test case: ------ struct Struct6934 { int[] x = [1,2]; } void bar6934(ref int[] p) { p = p[1..$]; } int bug6934() { Struct6934 q; bar6934(q.x); return 1; } static assert(bug6934());
Comment #2 by clugdbug — 2011-11-19T12:24:51Z
In fact passing arrays by reference is broken in non-trivial cases. Changing the test case to include an index or slice assignment reveals wrong-code problems: void bar6934(ref int[] p) { p[0] = 12; assert(p[0] == 12); // fails!!! p[0..1] = 17; assert(p[0] == 17); // fails!!! p = p[1..$]; } This applies to any complicated passing of an array by ref (any dotvar or index expression, or combination thereof). It applies to array index assignment, and slice assignment.
Comment #3 by bugzilla — 2011-12-14T16:56:46Z
Comment #4 by clugdbug — 2011-12-14T23:04:34Z
*** Issue 7109 has been marked as a duplicate of this issue. ***