[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