Re: Strange behavior when concatenating array

2011-06-17 Thread Steven Schveighoffer
On Fri, 17 Jun 2011 00:05:56 -0400, Jose Armando Garcia  
jsan...@gmail.com wrote:



It looks like the rt is not calling the postblit constructor when
concatenating arrays. For example, the following code:

import std.stdio;

struct Test
{
   this(this) { writeln(copy done); }
   void opAssign(Test rhs) { writeln(assignment done); }
   ~this() { writeln(destructor called); }
}

void main()
{
   Test[] tests = new Test[1];
   {
  Test test;
  tests ~= test;
   }
   writeln(done);
}

Gives the following output:

destructor called
done

The dtr for 'Test test;' is getting call after the scope exits but the
postblit ctr for 'tests[0]' is never called. I believe the output of
this code should either be:

done

or:

copy done
destructor called
done



You are right, postblit should be called.   
http://d.puremagic.com/issues/show_bug.cgi?id=5272


I'll look at doing a fix.

-Steve


Re: Strange behavior when concatenating array

2011-06-17 Thread Steven Schveighoffer
On Fri, 17 Jun 2011 06:42:51 -0400, Steven Schveighoffer  
schvei...@yahoo.com wrote:


On Fri, 17 Jun 2011 00:05:56 -0400, Jose Armando Garcia  
jsan...@gmail.com wrote:



It looks like the rt is not calling the postblit constructor when
concatenating arrays. For example, the following code:

import std.stdio;

struct Test
{
   this(this) { writeln(copy done); }
   void opAssign(Test rhs) { writeln(assignment done); }
   ~this() { writeln(destructor called); }
}

void main()
{
   Test[] tests = new Test[1];
   {
  Test test;
  tests ~= test;
   }
   writeln(done);
}

Gives the following output:

destructor called
done

The dtr for 'Test test;' is getting call after the scope exits but the
postblit ctr for 'tests[0]' is never called. I believe the output of
this code should either be:

done

or:

copy done
destructor called
done



You are right, postblit should be called.   
http://d.puremagic.com/issues/show_bug.cgi?id=5272


I'll look at doing a fix.


https://github.com/D-Programming-Language/druntime/pull/29

See if that helps.  On my system, your code now results in your expected  
output.


-Steve


Re: Strange behavior when concatenating array

2011-06-17 Thread Timon Gehr
Steven Schveighoffer wrote:
 https://github.com/D-Programming-Language/druntime/pull/29

 See if that helps.  On my system, your code now results in your expected
 output.

 -Steve

If the compiler optimizes well enough the output given could be valid (it might
construct the struct directly where it belongs). This needs some investigation.
Anyways, is druntime the correct place to fix this? If it _is_ a bug, isn't it a
compiler bug and not a bug in druntime? After a quick glimpse over your patch I
think the output will never be just done now.


Timon


Re: Strange behavior when concatenating array

2011-06-17 Thread Steven Schveighoffer

On Fri, 17 Jun 2011 18:52:05 -0400, Timon Gehr timon.g...@gmx.ch wrote:


Steven Schveighoffer wrote:

https://github.com/D-Programming-Language/druntime/pull/29

See if that helps.  On my system, your code now results in your expected
output.

-Steve


If the compiler optimizes well enough the output given could be valid  
(it might
construct the struct directly where it belongs). This needs some  
investigation.
Anyways, is druntime the correct place to fix this? If it _is_ a bug,  
isn't it a
compiler bug and not a bug in druntime? After a quick glimpse over your  
patch I

think the output will never be just done now.


The patch is still necessary in cases where the value being appended is  
not a temporary.  For example, if in the OP's code the test variable was  
used after appending it to the array.


Michel Fortin also brought up the point in a comment on the pull request.   
But the reality is, druntime cannot do any better without help from the  
compiler (the runtime needs to be told when to refrain from running a  
postblit).  It's a separate bug.


However, I think there is nothing invalid with doing both the postblit and  
the destructor on the temporary.  So at least the code is correctly  
calling the postblit.


-Steve


Re: Strange behavior when concatenating array

2011-06-16 Thread Jose Armando Garcia
On Fri, Jun 17, 2011 at 1:05 AM, Jose Armando Garcia jsan...@gmail.com wrote:
      tests ~= test;

Btw, if you replace this with 'test[0] = test;' it works as expected.
The postblit ctor and the assignment operator get called and the dtor
is called twice.