[Issue 18058] New: @nogc and forwarding lazy argument, particularly with scope

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Dec 11 07:23:05 UTC 2017


https://issues.dlang.org/show_bug.cgi?id=18058

          Issue ID: 18058
           Summary: @nogc and forwarding lazy argument, particularly with
                    scope
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: shachar at weka.io

Relevant forum thread is at
https://forum.dlang.org/thread/p0j3o9$1hhn$1@digitalmars.com

The program:
void func1(scope lazy string msg) @nogc {
}

void func2(scope lazy string msg) @nogc {
    func1(msg);
}

does not compile:
test.d(5): Error: @nogc function 'test.func2' cannot call non- at nogc delegate
'msg'

This is wrong. Since "msg" is never evaluated, the fact that it is not @nogc
should not matter (not to mention we should have a syntax where we mandate that
a lazy argument be @nogc, but that's another issue).

According to my analysis, there are actually two problems here. The first is
that "scope" on lazy is being ignored.

The second problem is that the lowering is overly complicated. Instead of
lowering to:

void func1(string delegate() msg) @nogc {
}

void func2(string delegate() msg) @nogc {
    func1(msg);
}

which would work with or without the "scope", it is probably lowered to:
void func1(string delegate() msg) @nogc {
}

void func2(string delegate() msg) @nogc {
    func1( (){ return msg();} );
}

which, if no scope is specified, requires that func2's frame be GCed. Since the
first argument is already a delegate, the second wrapping is completely
unnecessary.

--


More information about the Digitalmars-d-bugs mailing list