D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
[CTFE] can't use $ in a slice of an array passed by ref |
Product: |
D
|
Reporter: |
bearophile_hugs |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
normal
|
CC: |
bugzilla, clugdbug, youxkei
|
Priority: |
P2
|
Keywords: |
rejects-valid |
Version: |
D2 |
Hardware: |
x86 |
OS: |
Windows |
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()
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());
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.
*** Issue 7109 has been marked as a duplicate of this issue. ***