Hi, I previously had trouble trying to get print statements working while debugging in nogc. And that was hackishly solved [0], but I can't figure out how to do the same if I have @safe involved. Here's a cut down sample:

// This is the function from the thread referenced
auto assumeNoGC(T)(T t) {
    import std.traits;
    enum attrs = functionAttributes!T | FunctionAttribute.nogc;
return cast(SetFunctionAttributes!(T, functionLinkage!T, attrs)) t;
}

private struct Dispatcher {
    public template opDispatch(string name){
        auto ref opDispatch(Args...)(auto ref Args args) {
            import std.stdio;
            // Print args here for debugging purposes
            assumeNoGC({ writeln(args); })();
            return 3;
        }
    }
}

@safe @nogc void main() {
    auto i = Dispatcher().getI(3);
}

So, basically with the above, using:
    debug writeln(args);
Causes "Error: @nogc function D main cannot call non-@nogc function"

Using:
    debug assumeNoGC({ writeln(args); })();
Causes:
    Error: @safe function D main cannot call @system function
    Error: @nogc function D main cannot call non-@nogc function

Changing attrs in assumeNoGC
enum attrs = functionAttributes!T | FunctionAttribute.nogc | FunctionAttribute.safe
Causes same as previous errors

Adding @trusted to declaration of opDispatch gets rid of @safe error but I still get "Error: @nogc function D main cannot call non-@nogc function". And going through the codebase and figuring out where to add @trusted is *very* cumbersome.

I can't figure out how to make this work. The ideal way would be just a debug_print() function that works in nogc and safe code. I.e. does not affect the attribute inference of templates.

Cheers,
- Ali

[0] https://forum.dlang.org/post/pmf4dm$jmo$1...@digitalmars.com

Reply via email to