[Issue 12666] New: @nogc std.array.front, popFront, and more
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Apr 27 12:16:25 PDT 2014
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: nobody at puremagic.com
Reporter: bearophile_hugs at eml.cc
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- at nogc function
'test.main.MapResult!(__lambda1, immutable(int)[]).MapResult.popFront'
test.d(4,5): Error: @nogc function 'D main' cannot call non- at 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.
--
More information about the Digitalmars-d-bugs
mailing list