Bug 22095 – Closure not created or corrupted when accessing pointer in inline function

Status
RESOLVED
Resolution
DUPLICATE
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2021-07-01T06:17:13Z
Last change time
2022-08-12T04:55:53Z
Keywords
safe, wrong-code
Assigned to
No Owner
Creator
Vladimir Panteleev
See also
https://issues.dlang.org/show_bug.cgi?id=8538

Comments

Comment #0 by dlang-bugzilla — 2021-07-01T06:17:13Z
///////////////// test.d ///////////////// struct S { int[5] i; // must be 5 or greater } void main() { void delegate() dg; (){ S s = {[1,2,3,4,5]}; auto pS = &s; dg = { assert(*pS == S([1,2,3,4,5])); }; }(); dg(); } ////////////////////////////////////////// The assection
Comment #1 by dlang-bugzilla — 2021-07-01T06:25:30Z
(In reply to Vladimir Panteleev from comment #0) > The assection The assertion fails, presumably because the memory referenced by the pointer is no longer valid.
Comment #2 by kinke — 2021-07-01T18:00:24Z
> presumably because the memory referenced by the pointer is no longer valid. Exactly, but that's to be expected, as it's not captured. The problem is rather that this isn't caught when making everything @safe with -dip1000 - the compiler should complain that the address of local `s` is assigned to a heap closure `pS` with longer lifetime.
Comment #3 by dlang-bugzilla — 2021-07-01T21:53:01Z
(In reply to kinke from comment #2) > Exactly, but that's to be expected, as it's not captured. The problem is > rather that this isn't caught when making everything @safe with -dip1000 - > the compiler should complain that the address of local `s` is assigned to a > heap closure `pS` with longer lifetime. Not sure what you mean by this. s and pS should both be in the closure. As far as I can see, the code is valid even with @safe/-dip1000, and no warning should be emitted.
Comment #4 by dlang-bugzilla — 2021-07-01T22:07:34Z
Oh, does the compiler only put referenced variables in the closure? I thought it was the entire frame. Now this makes sense.
Comment #5 by bugzilla — 2022-07-28T06:13:37Z
This looks like the same problem as https://issues.dlang.org/show_bug.cgi?id=8538
Comment #6 by bugzilla — 2022-08-12T04:55:53Z
*** This issue has been marked as a duplicate of issue 8538 ***