[Issue 19371] Taking address of ref return in @safe code: compile-time checks fail

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Nov 13 16:40:48 UTC 2018


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

--- Comment #3 from Nick Treleaven <nick at geany.org> ---
(In reply to Stanislav Blinov from comment #2)
>     pragma(msg, typeof(() @safe { return &get(); }));
> 
> will print _error_.

What compiler are you using? With run.dlang.io the above (currently) prints:

int* delegate() pure nothrow @nogc @safe

It's the same even if I remove the @safe attribute, safety inference (or safe
consistency checking) is not happening inside typeof alone. 

BTW if I do this:

    auto f = { return &get(); };
    pragma(msg, typeof(f));

I get `int* delegate() pure nothrow @nogc @system`. The compiler does safety
inference for `f` before typeof(f) is analysed.

The same happens if I replace the literal with `{ return cast(int*)7; }`, it's
reported as @safe inside pragma(msg, typeof(...)), but @system when assigning
it to a variable `f` and doing pragma(msg, typeof(f)).

>     // since this doesn't compile:
>     int* getExplicit() @safe { return &get(); }
>     // ...then it has no type, therefore this should pass:
>     static assert(!is(typeof(() @safe { return &get(); })));

It depends if `typeof` is supposed to do @safe checking, or if it is just a
tool to extract a type from an expression (that appears to have a valid type),
even if that expression might not actually compile with full compiler checks. I
think it's the latter, which is why __traits(compiles) was invented.

--


More information about the Digitalmars-d-bugs mailing list