Bug 18793 – Semantics of scope(exit/success) modifying return value

Status
NEW
Severity
major
Priority
P2
Component
dlang.org
Product
D
Version
D2
Platform
All
OS
All
Creation time
2018-04-23T20:22:39Z
Last change time
2024-12-15T15:25:00Z
Keywords
industry
Assigned to
No Owner
Creator
johanengelen
Moved to GitHub: dlang.org#4087 →

Comments

Comment #0 by johanengelen — 2018-04-23T20:22:39Z
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); } ```
Comment #1 by simen.kjaras — 2018-04-24T08:52:07Z
Worth noting: On win32, the Small struct used above is not small enough to be passed by value. The intended behavior shows up when Small.sizeof <= 8.
Comment #2 by robert.schadek — 2024-12-15T15:25:00Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dlang.org/issues/4087 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB