On Thursday, 28 July 2016 at 21:07:22 UTC, ag0aep6g wrote:
On 07/28/2016 10:46 PM, Lodovico Giaretta wrote:
Also, the code of that maybe-not-@nogc library may not be available to check for this thing. Maybe the user doesn't want to trust the library writer, and so wants the compiler to guarantee no allocations at all.

If you can't check the code, you have to trust the library writer. One can hack around @nogc as it is. It's not like dmd checks the object file for GC allocations.

Yeah... So on one hand, currently, you could potentially have some random hack misbehaving inside @nogc code with no way to detect it, whereas a simple search for @assumenogc would immediately tell you if the @nogc convention was being broken for any reason. On the other hand, adding @assumenogc may increase the amount of instances where this is happening, cause this search to be mandatory for every package you decide to download.

Maybe if there were 3 variations, this could work:

// use current convention. 100% guarantee, no allocations.
@nogc

// same as current, but restriction can be broken by @nogc(off)
@nogc(weak)

// allows allocations. Can only override @nogc(weak), but not @nogc.
@nogc(off)


Example:

class NPC {
        Cake cake;
        void start() {
                cake = new Cake();  // OK
        }
        void update() @nogc(weak) {
                cake = new Cake();     // error: cannot allocate here
                @nogc(off) {
                        cake = new Cake();  // ok: alloc allowed in @nogc(off)
                }
        }
        void draw() @nogc {
                @nogc(off) {    // error: @nogc(off) not legal inside @nogc
                        cake = new Cake();
                }
                bar(); // error: nogc(weak) not callable here
        }
        void bar() @nogc(weak) { }
}

Reply via email to