[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