https://issues.dlang.org/show_bug.cgi?id=24612

          Issue ID: 24612
           Summary: Explicitly given `auto ref` parameter can’t bind by
                    lvalue by value
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nob...@puremagic.com
          Reporter: qs.il.paperi...@gmail.com

```d
void f(T)(auto ref T x) {}

void main()
{
    int x;
    f!long(x); // Error: template `f` is not callable using argument types
`!(long)(int)`
}
```

This should instantiate `f` as `f!long(long x)`, as `int` converts to `long`
and `cast(long)x` is an rvalue.

I don’t know how far with implicit conversions this should go, but it should
work for built-in integer and floating-point types. It should also work for
class/interface types with inheritance relationship, and while binding those by
`auto ref` is weird to do explicitly, such a binding might end up from
templates that bind arbitrary type objects that happen to be class handles in
the user’s code. Then:
```d
Exception e = new Exception("");
f!Object(e); // Currently error, should be pass-by-value
```

With my proposed fix for Issue 24611, users could opt-into `ref` explicitly if
they need to.

--

Reply via email to