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

          Issue ID: 14730
           Summary: Wrong closure var access with -inline
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: wrong-code
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nob...@puremagic.com
          Reporter: k.hara...@gmail.com

The assertion fails when you compile the code with -inline.

void main()
{
    static auto makeS2(int x)
    {
        struct S2
        {
            int n;
            int get() { return x; }     // x will be a cloaure variable
        }
        return S2(x);
    }
    auto s2a = makeS2(1);

    // Fails, because inlined get() returns incorrect value
    assert(s2a.get() == 1);
}

The parameter 'x' of makeS2 function is a closure variable. It's offset is
calculated in makeS2->toObjFile(). But with -inline, the get function call is
expanded in main(). Then the inlined code will access x via the hidden field of
s2a, by using 0 offset (wrong).

To fix the problem, we need to determine all offsets of closure vars in
front-end.

--

Reply via email to