https://issues.dlang.org/show_bug.cgi?id=12666
Issue ID: 12666
Summary: @nogc std.array.front, popFront, and more
Product: D
Version: D2
Hardware: x86
OS: Windows
Status: NEW
Keywords: rejects-valid
Severity: normal
Priority: P1
Component: Phobos
Assignee: [email protected]
Reporter: [email protected]
import std.algorithm: map;
immutable data = [1];
void main() @nogc {
foreach (w; data.map!((x) @nogc pure nothrow => x)) {}
}
test.d(4,5): Error: @nogc function 'D main' cannot call non-@nogc function
'test.main.MapResult!(__lambda1, immutable(int)[]).MapResult.popFront'
test.d(4,5): Error: @nogc function 'D main' cannot call non-@nogc function
'test.main.MapResult!(__lambda1, immutable(int)[]).MapResult.front'
Taking a better look the problem seems to be in std.array.front (and popFront):
@property ref T front(T)(T[] a) @safe pure nothrow
if (!isNarrowString!(T[]) && !is(T[] == void[]))
{
assert(a.length, "Attempting to fetch the front of an empty array of " ~
T.stringof);
return a[0];
}
void main() @nogc {
auto data = [1];
data.front;
}
A possible solution:
import std.traits: isNarrowString;
@property ref T front(T)(T[] a) @safe pure nothrow
if (!isNarrowString!(T[]) && !is(T[] == void[]))
{
enum msg = "Attempting to fetch the front of an empty array of " ~
T.stringof;
assert(a.length, msg);
return a[0];
}
void main() @nogc {
auto data = [1];
data.front;
}
A small disadvantage of this solution is that the error message is now computed
statically, increasing binary size. But those array functions are too much
important, otherwise lot of other ranges can't work in @nogc code.
--