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: -------

Reply via email to