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: [email protected]
ReportedBy: [email protected]
--- Comment #0 from Cristi Cobzarenco <[email protected]> 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: -------