Thread overview
[Issue 22239] Can't migrate from postblits if they are used without frame pointer
Aug 26
RazvanN
Aug 26
RazvanN
August 26
https://issues.dlang.org/show_bug.cgi?id=22239

RazvanN <razvan.nitu1305@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |razvan.nitu1305@gmail.com

--- Comment #1 from RazvanN <razvan.nitu1305@gmail.com> ---
This affects normal constructors as well (copy constructors are just a particularization of a normal constructor):

struct Normal(alias al)
{
    this(int a) {}
    void x() {}
}

void main()
{
    Normal!(x => x) a;

    a.f;
}

void f(T)(T x)
{
    T y = 6;
}

--
August 26
https://issues.dlang.org/show_bug.cgi?id=22239

--- Comment #2 from RazvanN <razvan.nitu1305@gmail.com> ---
Hmmm, this code fails also:

struct PostBlitted(alias al)
{
  this(this){}
  void x(){} //a member function so that an instance contains a frame pointer
}

void main()
{
  PostBlitted!(x => x) a;
  a.f;
}

void f(T)(T x)
{
    T y;
}

--
August 26
https://issues.dlang.org/show_bug.cgi?id=22239

--- Comment #3 from Ate Eskola <Ajieskola@gmail.com> ---
That last example is supposed to fail. `PostBlitted!(x => x)` contains a hidden context pointer to `main` to construct, so they can be default-initialized only at `main`. Not at `f`.

(It could be argued that no frame pointer should be needed because `x => x` does not use any variables from `main`, but that's a different issue)

Default blittings, and thus postblits, work, because the hidden context pointer gets copied from the original instance.

But I can't come up with a way to do the same with a copy constructor. Well, I suppose I could devise a workaround with `static opCall`, but we're supposed to replace postblits with copy constructors, not with hackish workarounds.

--