[Issue 14771] New: Hidden @nogc violation around closure creation
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat Jul 4 22:15:12 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14771
Issue ID: 14771
Summary: Hidden @nogc violation around closure creation
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Keywords: accepts-invalid
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: k.hara.pg at gmail.com
The variable x in makeS() function is actually placed in closure object on
heap, but it's not checked by the @nogc.
struct S(alias f)
{
auto foo()() { return f(0); }
void dummy() {}
}
auto makeS() @nogc
{
int x = 10;
S!(a => x) s;
// instantiating foo inside makeS will raise the @nogc violation error.
//assert(s.foo() == 10);
return s;
}
void main() @nogc
{
auto s = makeS();
// the hidden field of s is actually non-null,
// that points closure object on heap.
assert(s.tupleof[$-1] !is null);
// instantiating foo outside makeS will place the variable x in closure
// *after* the semantic3 completion of the function.
// --> @nogc attribute on makeS() is ignored!
// --> @nogc on main() has no effect, so foo itself has no GC-allocation.
assert(s.foo() == 10);
}
--
More information about the Digitalmars-d-bugs
mailing list