Bug 7530 – Postblit not called structs returned from an array index expr.

Status
RESOLVED
Resolution
FIXED
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-02-17T04:15:00Z
Last change time
2012-05-12T17:25:45Z
Keywords
pull, wrong-code
Assigned to
nobody
Creator
sludwig

Attachments

IDFilenameSummaryContent-TypeSize
1076bug_refcount2.dReproduction caseapplication/octet-stream981

Comments

Comment #0 by sludwig — 2012-02-17T04:15:29Z
Created attachment 1076 Reproduction case Attached is a small example with a pseudo RefCount struct. Running with the ternary operator enabled "dmd -version=BUG -run" yields: --- 1st pass CREATE 18FE34 1 COPY 443FD0 2 DESTROY 18FE34 2 IN DESTROY 18FE34 1 OUT POS2: 443FD0 1 DESTROY 18FE5C 1 IN <- destroys the object although the static DESTROY 18FE5C -100 OUT array should still hold a reference 2nd pass POS1: 443FD0 0 <- the static variable now references an POS2: 443FD0 0 already destroyed object DESTROY 18FE5C 0 IN DESTROY 18FE5C -1 OUT --- The line "return cnt[0];" fails to call the struct's postblit and causes the returned object to get destroyed as the ref count goes to zero. running with "dmd -run" yields the expected output: --- 1st pass CREATE 18FE34 1 COPY 4B3FD0 2 DESTROY 18FE34 2 IN DESTROY 18FE34 1 OUT POS2: 4B3FD0 1 COPY 18FE5C 2 <- correctly copied on return DESTROY 18FE5C 2 IN DESTROY 18FE5C 1 OUT 2nd pass POS1: 4B3FD0 1 POS2: 4B3FD0 1 COPY 18FE5C 2 <- correctly copied on return DESTROY 18FE5C 2 IN DESTROY 18FE5C 1 OUT <- the static reference is still there --- "auto ret = cnt[0]; return ret;" will correctly call the postblit constructor. Occurs at least in DMD 2.058 and 2.057.
Comment #1 by lovelydear — 2012-04-20T01:00:49Z
See also issue 7516
Comment #2 by k.hara.pg — 2012-05-10T19:38:07Z
Reduced test case: void main() { static struct S { int val; this(int n) { val = n; } this(this) { val *= 3; } } S[] sa = new S[](1); sa[0].val = 1; S foo() { return sa[0]; // postblit should run } auto s = foo(); assert(s.val == 3); }
Comment #3 by k.hara.pg — 2012-05-10T19:38:30Z
*** Issue 7541 has been marked as a duplicate of this issue. ***
Comment #4 by k.hara.pg — 2012-05-10T22:53:11Z
Comment #5 by github-bugzilla — 2012-05-12T15:07:20Z
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/e72fa541029d2c09daa992e78f2adf33d1bd8045 fix Issue 7530 - Postblit not called structs returned from an array index expr. https://github.com/D-Programming-Language/dmd/commit/481f5585639de6dbf94e6b80510f767dc5e81b64 Merge pull request #939 from 9rnsr/fix_postblit Issue 7506 & 7530 more postblit fixes