[Issue 24612] New: Explicitly given `auto ref` parameter can’t bind by lvalue by value
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Jun 16 11:37:50 UTC 2024
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: nobody at puremagic.com
Reporter: qs.il.paperinik at 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.
--
More information about the Digitalmars-d-bugs
mailing list