May 20, 2005
int main()
{
   Object[] array = null;

   void dofirst()
   {
      Object o1 = new Exception("first");
      //array = (&o1)[0 .. 1] ~ array; // Causes Access Violation when using toString() on the array...
      array = (&o1)[0 .. 1].dup ~ array; // Works.
   }

   dofirst();
   Object o2 = new Exception("second");
   array ~= o2;

   printf("array[0] = %.*s; array[1] = %.*s;", array[0].toString(), array[1].toString()); // ...here

   return 0;
}


Shouldn't ~ create a safe new heap array even if its operands are local? I had to put that first one in the nested function so it could screw with the stack I guess. This is a dumbed down example of something much larger in my code that heavily (in many areas) relies on ~ copying.
May 20, 2005
"Vathix" <vathix@dprogramming.com> wrote in message news:op.sq22b3takcck4r@esi...
> int main()
> {
>    Object[] array = null;
>
>    void dofirst()
>    {
>       Object o1 = new Exception("first");
>       //array = (&o1)[0 .. 1] ~ array; // Causes Access Violation when
> using toString() on the array...
>       array = (&o1)[0 .. 1].dup ~ array; // Works.
>    }
>
>    dofirst();
>    Object o2 = new Exception("second");
>    array ~= o2;
>
>    printf("array[0] = %.*s; array[1] = %.*s;", array[0].toString(),
> array[1].toString()); // ...here
>
>    return 0;
> }
>
>
> Shouldn't ~ create a safe new heap array even if its operands are local? I had to put that first one in the nested function so it could screw with the stack I guess. This is a dumbed down example of something much larger in my code that heavily (in many areas) relies on ~ copying.

It is true the documentation says ~ always dups even if one of the inputs is empty. It looks like in practice it does not dup if one of the inputs is empty. Either the doc is out of date or ~ needs a fix.