[Issue 16197] Postblit not being called properly

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Thu Jun 23 09:30:55 PDT 2016


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

David Nadlinger <code at klickverbot.at> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |code at klickverbot.at

--- Comment #3 from David Nadlinger <code at klickverbot.at> ---
DMD from Git master (v2.072.0-devel-20e1c81) seems to call too many
postblits/ctors, though, when initialising the Ctr instances and then assigning
the Elem literals:
---
construct Ctr {
POSTBLIT -1 (7FFF5C07F598)
POSTBLIT -1 (7FFF5C07F59C)
POSTBLIT -1 (7FFF5C07F5A0)
}
assign arr {
CTOR 1 (7FFF5C07F5B4)
CTOR 2 (7FFF5C07F5C0)
CTOR 3 (7FFF5C07F5C4)
}
slice rval -> arr {
POSTBLIT 1 (7FFF5C07F5D0)
POSTBLIT 2 (7FFF5C07F5D4)
POSTBLIT 3 (7FFF5C07F5D8)
}
DTOR 3 (7FFF5C07F5D8)
DTOR 2 (7FFF5C07F5D4)
DTOR 1 (7FFF5C07F5D0)
arr rval -> arr {
POSTBLIT 1 (7FFF5C07F520)
POSTBLIT 2 (7FFF5C07F524)
POSTBLIT 3 (7FFF5C07F528)
}
DTOR 3 (7FFF5C07F5F0)
DTOR 2 (7FFF5C07F5EC)
DTOR 1 (7FFF5C07F5E8)
DTOR 3 (7FFF5C07F5A0)
DTOR 2 (7FFF5C07F59C)
DTOR 1 (7FFF5C07F598)
---

Note that the CTOR-created instances (7FFF5C07F5B4 and so on) are never
destructed.

(The output is from a slightly modified test case that prints the struct
address in parens:

---
import std.stdio:writeln;

struct Elem {
    int x = -1;
    this(int x) { this.x = x; writeln("CTOR ", x, " (", cast(void*)&this, ")");
}
    this(this) { writeln("POSTBLIT ", x, " (", cast(void*)&this, ")"); }
    ~this()    { if (x!=-1) writeln("DTOR "    , x, " (", cast(void*)&this,
")"); }
}

struct Ctr {
    Elem[3] arr;
    Elem[] slice() { return arr; }
    Elem[3] arrVal() { return arr; }
}

void main() {
    writeln("construct Ctr {");
    auto p = Ctr();
    writeln("}");
    writeln("assign arr {");
    p.arr = [Elem(1), Elem(2), Elem(3)];
    writeln("}");
    {
        writeln("slice rval -> arr {");
        Elem[3] _arr = p.slice;
        writeln("}");
    }
    {
        writeln("arr rval -> arr {");
        Elem[3] _arr = p.arrVal();
        writeln("}");
    }
}
---
)

--


More information about the Digitalmars-d-bugs mailing list