On Friday, 28 June 2013 at 14:26:04 UTC, Maxim Fomin wrote:
On Friday, 28 June 2013 at 08:08:17 UTC, monarch_dodra wrote:
Just in case it wasn't clear from the original explanation,
this is a bug, it *should* be perfectly safe to pass as many
temps as you want, and expect the right amount of destructor
called in case of a throw.
Original explanation lacks the word "bug" deliberately because
this is not a bug (in a sense that dmd generates wrong code),
but a language design problem. How could you do this:
struct S
{
int i = 1;
}
void foo(S s)
{
s.i = 2;
}
void main()
{
S s;
foo(s);
}
Currently there are two dtors, one which gets S(2) at the end
of foo and second at the end of main, which gets S(1). If you
move dtor from callee to caller, it would get S(1) object
(struct is passed by value), but it doesn't make sense to
destruct S(1) where you have S(2). One possible solution is to
pass by pointer in low level, which would probably increase
magnitude of problems.
I don't understand the problem... There *should* be two
destroyers... "main.s" is postblitted into "foo.s", and then foo
destroys "foo.s" at the end of its scope...
Where is the problem here?