On Friday, 20 April 2018 at 14:02:17 UTC, Steven Schveighoffer
wrote:
On 4/20/18 4:24 AM, Nick Treleaven wrote:
On Wednesday, 18 April 2018 at 16:47:50 UTC, ag0aep6g wrote:
You can get a pointer from the ref return:
Value* p = &aa.slot("key", { inserted = true; return
Value.init; });
This is not @safe, even with -dip1000:
Error: cannot take address of ref return of f() in @safe
function main
Hm... I would have expected it to work in dip1000.
Hard for me to understand what dip1000 is doing, but it seems
like an omission:
@safe ref int foo(return ref int x) { return x; }
void main() @safe
{
int x;
scope int *xp = &x; // OK with dip1000
xp = foo(x); // Error, even though it's exactly the same
}
And in this case, it doesn't even need to be scope, as it's GC
data. How does one communicate that the ref return is of GC
data and can be escaped as much as you want?
-Steve
The error seems to be about type mismatching, it works if you use
auto. I don't see how you could convert the `ref int` to `int *`
https://run.dlang.io/is/eIJMIK