On Saturday, 13 January 2018 at 12:22:17 UTC, Heromyth wrote:
When executing the test code, it will exit abnormally. It seems *this.output* is pointing a free memory when executing *writer.write(dom)*.

I'm not sure whether there is a bug in the compiler. If it is, I can file a bug. If not, somebody can tell me how to fix this.

Thanks!

Here is my test code (You can test it in https://run.dlang.io/is/0OPBVI):

==============================
import std.stdio;

void main()
{
    bugTest();
}

// This code is stripped from https://github.com/Kozzi11/experimental.xml/blob/master/source/std/experimental/xml/writer.d
void bugTest()
{
    string dom = "XML DOM";

    auto file = File("catalogue.xml", "w");

    // It's OK
    // auto textWriter = file.lockingTextWriter;
    // textWriter.writerFor.write(dom);

    // There's a bug
    auto writer = writerFor(file.lockingTextWriter);
    writer.write(dom);

    file.close();
}

auto writerFor(OutRange)(auto ref OutRange outRange)
{
    auto res = Writer!(OutRange)();
    res.setSink(outRange);
    return res;
}

struct Writer(OutRange)
{
    private OutRange* output;

    void setSink(ref OutRange output)
    {
        this.output = &output;
        writeln("in setSink: ", this.output);
    }

    // void setSink(typeof(output) output)
    // {
    //  this.output = output;
    // }

    void write(string s)
    {
        writeln("in write: ", output);
        output.put(s);
    }
}

It's your bug.
file.lockingTextWriter does not return a reference.
It is passed to writerFor as a copy on the stack and in setSink you get a pointer of a stack variable that gets killed after writerFor returns.

Reply via email to