[Issue 15832] Crashing program when a helper template function is used to create a template struct

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Mar 28 06:47:29 PDT 2016


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

--- Comment #7 from Atila Neves <atila.neves at gmail.com> ---
In the following code, the length is garbage, and uncommenting an assert makes
the problem move!


import std.traits;
import std.conv;

int delegate(int) dg;

static this() {
    dg = i => i * 2;
}


struct MockScope(T) {
    this(T)(ref T oldFunc, T newFunc) {
        _oldFuncPtr = &oldFunc;
        _oldFunc = oldFunc;
        oldFunc = newFunc;
    }

    ~this() {
        *_oldFuncPtr = _oldFunc;
    }

 private:

    T* _oldFuncPtr;
    T _oldFunc;
}

struct Mock(T) {
    this(ref T func) {
        _returns = [ReturnType!T.init];
        ReturnType!T inner(ParameterTypeTuple!T values) {
            auto ret = _returns[0];
            assert(_returns.length < 10, "Weird length1: " ~
_returns.length.to!string);
            if(_returns.length > 1) _returns = _returns[1..$];
            assert(_returns.length < 10, "Weird length2: " ~
_returns.length.to!string);
            return ret;
        }
        func = &inner;
        _scope = MockScope!(T)(func, &inner);
    }

    void returnValue(V...)(V value) {
        _returns.length = 0;
        foreach(v; value) _returns ~= v;
        // uncomment below and things work
        assert(_returns.length < 10, "Weird length3: " ~
_returns.length.to!string);
    }

    MockScope!T _scope;
    ReturnType!T[] _returns;
}

auto mock(T)(ref T f) {
    return Mock!T(f);
}

void main() {
    //auto m = Mock!(typeof(dg))(dg);
    auto m = mock(dg); // this should be equivalent but crashes
    assert(dg(3) == 0);
    m.returnValue(42);
    assert(dg(3) == 42);
}

--


More information about the Digitalmars-d-bugs mailing list