Error: @nogc function 'test.func2' cannot call non- at nogc delegate 'msg'
Shachar Shemesh
shachar at weka.io
Mon Dec 11 07:23:41 UTC 2017
Submitted
https://issues.dlang.org/show_bug.cgi?id=18058
On 10/12/17 14:07, Shachar Shemesh wrote:
> On 10/12/17 14:00, Shachar Shemesh wrote:
>> On 10/12/17 13:44, Jonathan M Davis wrote:
>>> it sounds like the delegate that's
>>> being generated isn't @nogc, so it can't be called within the function,
>>> which would be a completely different issue from allocating a closure.
>>
>> Here's the thing, though. There is no reason for the delegate to be
>> called at all!
>>
>> Since func1's msg is also lazy, I expected the lowering to look like
>> this:
>>
>> void func1(/*scope*/ string delegate() msg) @nogc {
>> }
>>
>> void func2(/*scope*/ string delegate() msg) @nogc {
>> func1(msg);
>> }
>>
>> Even with scope commented out, the above compiles just fine. The fact
>> that msg is not @nogc doesn't matter at all, simply because no one is
>> evaluating the delegate.
>
> I think I got it. I think the lowering is this:
>
> void func1(/*scope*/ string delegate() msg) @nogc {
> }
>
> void func2(/*scope*/ string delegate() msg) @nogc {
> func1((){ return msg(); });
> }
>
> With "scope" commented out, this generates the following error:
> test.d(15): Error: function test.func2 is @nogc yet allocates closures
> with the GC
> test.d(16): test.func2.__lambda2 closes over variable msg at
> test.d(15)
>
> So there are two problems here. The first is that a "lazy" generated
> delegate does not get forwarded to a function, and instead gets wrapped
> by a completely useless temporary delegate. The second is that scope on
> lazy is not honored.
>
> I'll file a bug report.
>
> Shachar
More information about the Digitalmars-d
mailing list