[Issue 15965] [REG 2.070] Reference to other CT-known field on struct instantiation now yields "circular reference"

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Fri May 6 07:09:42 PDT 2016


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

--- Comment #1 from Kenji Hara <k.hara.pg at gmail.com> ---
First, is the summary "[REG 2.070] ..." a mistake of REG-master (or REG-devel,
etc)? 

You've said:

> This used to compile up until 2.071.0, where it broke.

So the *issue* exists only in current master branch that not yet released as
2.072.

----

The displayed error with git-head dmd is:

test.d(4): Error: struct test.Element no size because of forward reference

And yes it is an intentional change. Until 2.071, an use of 'offsetof' property
during declarations of instance fields has returned 0 always. Next is an
example of the bug:

struct Element
{
    ubyte x;    // add a field before Element.val

    public ubyte[256] val;

    // printed 0 until 2.071, it was incorrect
    pragma(msg, "1: ", val.offsetof);

    private ubyte[(val.offsetof + 256) % size_t.sizeof] _padding;
}

// After Element struct fields are determined, offsetof can return correct
result
pragma(msg, "2: ", Element.val.offsetof);

// If val.offsetof correctly returned 1 during declaration of _padding,
// this pragma(msg) would have printed 1, but actually it printed 0...
pragma(msg, Element._padding.sizeof);

To disallow use of incorrect offsetof value, the "no size bevause of ..." error
was introduced.

----

Although the master change is intentional, I still think compiler would be able
to supply correct offset value in the OP case. In other words, I think we can
change this issue to an enhancement request.

--


More information about the Digitalmars-d-bugs mailing list