[Issue 18793] New: Semantics of scope(exit/success) modifying return value
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Apr 23 20:22:39 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=18793
Issue ID: 18793
Summary: Semantics of scope(exit/success) modifying return
value
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: johanengelen at weka.io
When the return value is modified inside a scope(exit/success) block, the spec
does not say what the semantics are.
A test program that demonstrates that the implementation exhibits different
semantics depending on function call ABI (returned large structs are passed by
ref):
```
import std.stdio;
struct Big {
ulong a;
ulong[4] b;
}
struct Small {
ulong a;
ulong b;
}
auto quirk(T)() {
T result;
scope(success)
{
result.a = 10;
}
return result;
}
void main() {
auto small = quirk!Small();
writeln(small);
auto big = quirk!Big();
writeln(big);
}
```
The issue is further complicated if the return expression also modifies the
return value; i.e. we also need semantics for this testcase:
```
import std.stdio;
struct Big {
ulong a;
ulong[4] b;
}
struct Small {
ulong a;
ulong b;
}
auto ref addOne(T)(ref T t)
{
t.a += 1;
return t;
}
auto quirk(T)() {
T result;
scope(exit)
{
result.a = 10;
}
return addOne(result);
}
void main() {
auto small = quirk!Small();
writeln(small);
auto big = quirk!Big();
writeln(big);
}
```
--
More information about the Digitalmars-d-bugs
mailing list