http://d.puremagic.com/issues/show_bug.cgi?id=9720

           Summary: OSX wrong code with -o "Illegal instruction"
           Product: D
           Version: D2
          Platform: All
        OS/Version: Mac OS X
            Status: NEW
          Severity: blocker
          Priority: P2
         Component: DMD
        AssignedTo: [email protected]
        ReportedBy: [email protected]


--- Comment #0 from [email protected] 2013-03-14 07:12:20 PDT ---
Investigated from:
https://github.com/D-Programming-Language/phobos/pull/878
http://d.puremagic.com/test-results/pull-history.ghtml?projectid=1&repoid=3&pullid=878

Happens with OSX, when compile with -O.

Below a reduced test case:

//----
import std.stdio;

//Simplified RefCounted
struct MyRef(T)
{
    private struct Impl
    {
        T _payload;
        size_t _count;
    }
    Impl* _store;

    this(int i)
    {
        _store = new Impl;
        _store._payload = T.init;
        _store._count = 1;
    }

    ~this()
    {
        if (!_store) return;
        writeln("d: ", _store._count); //Comment me
        --_store._count;
    }
}

//Extracted from Array
struct Payload
{
    size_t _capacity; //Comment me
    int[] _pay;       //Comment me

    size_t insertBack(Stuff)(Stuff /+stuff+/)
    {
        immutable newLen   = _pay.length + 3;
        _pay.length = newLen;
        _pay = _pay[0 .. newLen]; //Comment me
        return 3;
    }
}
alias Data = MyRef!Payload;

unittest
{
    auto a = Data(1);
    auto b = Data(1);
    writeln(__LINE__);
    a._store._payload.insertBack(1); //Passes
    writeln(__LINE__);
    a._store._payload.insertBack(b); //Fails
    writeln(__LINE__);
}
//----
rdmd  -w -d -property -O --main -unittest test2.d
47
49
d: 1
Illegal instruction
//---
I was not able to simplify much more, as the compile-time behavior is non
deterministic: EG: removing an unused variable such as "capacity" is enough to
make the problem "disappear" (or at least, unobservable).

AFAIK, this code contains nothing unsafe, and the only requirement to reproduce
is as simple as "pass by value something with a destructor"... (!)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to