[Issue 6195] New: [GSoC] opSlice defined on range prevents call to postblit.

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jun 22 08:56:50 PDT 2011


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

           Summary: [GSoC] opSlice defined on range prevents call to
                    postblit.
           Product: D
           Version: D2
          Platform: All
        OS/Version: Windows
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: cristi.cobzarenco at gmail.com


--- Comment #0 from Cristi Cobzarenco <cristi.cobzarenco at gmail.com> 2011-06-22 08:52:02 PDT ---
import std.stdio;

struct Test {
    int count;

    this( int x )                { count = x; }
    this( this )                 { writeln("Postblit!"); }

    typeof(this)   opSlice()     { return this; }
    int            front() const { return 42; }
    @property bool empty() const { return count == 0; }
    void           popFront()    { --count; }

}

int main(string[] argv) {
    auto v = Test(5);

    foreach( x ; v )
        writeln( x );
    writeln( "Count: ", v.count );
    return 0;
}

In the code above "Postblit!" doesn't get written, but a copy of v is
definitely created since "Count: 5" gets printed. It seems that foreach() calls
opSlice and for some reason the returned object gets blitted without calling
the postblit ctor (maybe a misguided return value optimization?).
Removing the opSlice() definition results in correct behaviour.

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


More information about the Digitalmars-d-bugs mailing list