November 07, 2020
https://issues.dlang.org/show_bug.cgi?id=21369

          Issue ID: 21369
           Summary: Compiler doesn't allow lvalues via alias this when
                    wrapper is an rvalue
           Product: D
           Version: D2
          Hardware: x86
                OS: Mac OS X
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody@puremagic.com
          Reporter: schveiguy@yahoo.com

Consider the following struct:

struct S
{
   int *val;
   ref int get() { return *val; }
}

void foo(ref int x) {}

void main()
{
   int x;
   foo(S(&x).get);
}

This builds fine. However, using alias this to forward to the get function:

struct S
{
   int *val;
   ref int get() { return *val; }
   alias get this;
}

void foo(ref int x) {}

void main()
{
   int x;
   foo(S(&x));
}

I get:

onlineapp.d(15): Error: function onlineapp.foo(ref int x) is not callable using
argument types (S)
onlineapp.d(15):        cannot pass rvalue argument S(& x) of type S to
parameter ref int x

Clearly, the alias this should work, especially since if I call the aliased member directly it does work.

This is a block for creating correct smart reference types.

--