[Issue 7516] New: Postblit not called for structs returned from a ternary operator
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Feb 16 03:29:00 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7516
Summary: Postblit not called for structs returned from a
ternary operator
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Keywords: wrong-code
Severity: major
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: sludwig at outerproduct.org
--- Comment #0 from Sönke Ludwig <sludwig at outerproduct.org> 2012-02-16 03:28:54 PST ---
Created an attachment (id=1075)
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
POS1: 613D80 -100
CREATE 18FDFC 1
DESTROY 18FDE0 -100 IN
DESTROY 18FDE0 -100 OUT
POS2: 613D80 1
DESTROY 18FE0C 1 IN <- destroys the object although the static
variable
DESTROY 18FE0C -100 OUT in func() should still hold a reference
2nd pass
POS1: 613D80 0 <- the static variable now references a destroyed
POS2: 613D80 0 object
DESTROY 18FE0C 0 IN
DESTROY 18FE0C -1 OUT
---
The line "return cnt.cnt ? cnt : cnt;" fails to call the struct's postblit and
causes the returned object to get destroyed.
running with "dmd -run" yields the expected output:
---
1st pass
POS1: 533D80 -100
CREATE 18FDFC 1
DESTROY 18FDE0 -100 IN
DESTROY 18FDE0 -100 OUT
POS2: 533D80 1
COPY 18FE0C 2 <- correctly copied on return
DESTROY 18FE0C 2 IN
DESTROY 18FE0C 1 OUT
2nd pass
POS1: 533D80 1
POS2: 533D80 1
COPY 18FE0C 2
DESTROY 18FE0C 2 IN
DESTROY 18FE0C 1 OUT <- the static reference is still there
---
"return cnt;" will correctly call the postblit constructor.
Occurs for DMD 2.058 (2.57 fails for both cases)
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list