[Issue 13113] cannot build druntime's gc.d with -debug=INVARIANT, bad @nogc inference?

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Jul 14 19:46:55 PDT 2014


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

Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Version|unspecified                 |D2
                 OS|Windows                     |All
           Severity|regression                  |major

--- Comment #6 from Kenji Hara <k.hara.pg at gmail.com> ---
This is not a regression, it's a compiler bug around invariant and attributes.

Currently dmd implements both post invariant call in constructor and pre
invariant call in destructor as direct call.
But in normal member functions, pre/post invariant call is done virtually.

And, only direct invariant call is affected by the check of pure, @safe, and
@nogc attributes. Note that, it is not affected by nothrow but it is not
intentional behavior.

class C
{
    invariant() {}    // impure, throwable, system, and gc-able

    this(int) pure nothrow @safe @nogc {}  // line 5
    // post invaiant is called directly and reports attribute violation error

    ~this() pure nothrow @safe @nogc {}    // line 8
    // pre invaiant is called directly and reports attribute violation error

    void foo() pure nothrow @safe @nogc {}
    // pre/post virtual invariant call does not report attribute violation
error
}

Output:

Error: pure function 'test.C.this' cannot call impure function
'test.C.__invariant'
test.d(5): Error: safe function 'test.C.this' cannot call system function
'test.C.__invariant'
test.d(5): Error: @nogc function 'test.C.this' cannot call non- at nogc function
'test.C.__invariant'
Error: pure function 'test.C.~this' cannot call impure function
'test.C.__invariant'
test.d(8): Error: safe function 'test.C.~this' cannot call system function
'test.C.__invariant'
test.d(8): Error: @nogc function 'test.C.~this' cannot call non- at nogc function
'test.C.__invariant'


(In reply to Rainer Schuetze from comment #1)
> I'm not 100% sure this is a regression, because the code inside the
> invariant changed, too. 
> Is there a reason why the destructor has to be @safe, pure and @nogc?

So, the original issue is not a compiler regression. It was introduced by
druntime change in Gcx class invariant code.

--


More information about the Digitalmars-d-bugs mailing list