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: nob...@puremagic.com ReportedBy: slud...@outerproduct.org --- Comment #0 from S�nke Ludwig <slud...@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: -------