[Issue 9985] Postblit isn't called on local struct return
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Apr 25 00:56:12 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9985
--- Comment #5 from Kenji Hara <k.hara.pg at gmail.com> 2013-04-25 00:56:11 PDT ---
(In reply to comment #0)
> For this program: http://dpaste.dzfl.pl/d73575a1
Don't link to external web site. Instead please directly paste the code in
comment, or attach code file.
// Code:
import std.stdio;
struct S
{
ubyte* b;
ubyte buf[128];
this(this)
{
writeln("postblit");
}
}
auto ref makeS()
{
S s;
s.b = s.buf;
writeln("made S at ", cast(void*)&s, ", s.b == ", s.b);
return s;
}
void main()
{
S s = makeS();
writeln("got back S at ", cast(void*)&s, ", s.b == ", s.b);
}
> I get
>
> made S at 18FC64, s.b == 18FC68
> got back S at 18FCF4, s.b == 18FC68
>
> as output. Note that no "postblit" message was printed.
> Patching s.b to point into the newly allocated struct in postblit is crucial
> here, but it seems like the postblit constructor isn't called, nor is there any
> attempt
> to optimize away the temporary in `makeS()` even with -O.
> Am I doing something wrong?
>
> http://dpaste.dzfl.pl/cc460feb
// Code:
import std.stdio;
struct S
{
ubyte* b;
ubyte buf[128];
this(this)
{
writeln("postblit");
}
}
auto ref makeS()
{
S s;
s.b = s.buf;
writeln("made S at ", cast(void*)&s, ", s.b == ", s.b);
return s;
}
void main()
{
S s = makeS();
writeln("got back S at ", cast(void*)&s, ", s.b == ", s.b);
}
> copies the struct and ivokes postblit just fine.
--
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