[Issue 20582] New: destroy should be @nogc if class constructor is @nogc

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Feb 15 13:27:26 UTC 2020


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

          Issue ID: 20582
           Summary: destroy should be @nogc if class constructor is @nogc
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: druntime
          Assignee: nobody at puremagic.com
          Reporter: htvennik at gmail.com

-----
class C
{
    ~this() @nogc { }
}

void foo()
{
    auto c = new C();
    () @nogc { destroy(c); } ();
}
-----

Above code snippet should compile, but doesn't:


destroy_nogc.d(9): Error: @nogc delegate destroy_nogc.foo.__lambda1 cannot call
non- at nogc function object.destroy!(true, C).destroy



This also causes the following to fail:

-----
import std.experimental.allocator : make, dispose;
import std.experimental.allocator.mallocator : Mallocator;

class C
{
    ~this() @nogc { }
}

void foo() @nogc
{
    auto c = Mallocator.instance.make!C();
    Mallocator.instance.dispose(c);
}
-----

Here, dispose is inferred to be non- at nogc because it calls destroy, which is
not @nogc, and thus the following error is produced:


make_dispose_nogc.d(12): Error: @nogc function make_dispose_nogc.foo cannot
call non- at nogc function std.experimental.allocator.dispose!(shared(Mallocator),
C).dispose

This effectively makes it impossible to write 100% @nogc code.

--


More information about the Digitalmars-d-bugs mailing list