[Issue 14696] New: destructor for temporary called before statement is complete with ternary operator and alias this

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Sat Jun 13 19:23:27 PDT 2015


https://issues.dlang.org/show_bug.cgi?id=14696

          Issue ID: 14696
           Summary: destructor for temporary called before statement is
                    complete with ternary operator and alias this
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: wrong-code
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: schveiguy at yahoo.com

If a type's alias this is used as the parameter to a function, and that
instance is a temporary, it should not be destroyed before the call occurs.

However, if that type is part of ternary operator, the dtor is called FIRST.
Example:

import std.stdio;
struct S
{
    void *get() {return null;}
    ~this() { writeln("S.dtor");}
    alias get this;
}

S makes() { return S();}

void foo(void *x) { writeln("foo"); }

void main(string[] args)
{
    foo(args.length ? makes() : null);
}

The output:

S.dtor
foo

If, for example, S's dtor destroys the memory that is returned by get(), then
this will result in dangling pointer to destroyed memory being passed to foo.

Real life example:
https://github.com/D-Programming-Language/phobos/pull/3404#issuecomment-111704941

I'm uncertain what is required to make this happen. If I remove the ternary
expression, then the destructor is properly called after foo. But I don't know
if alias this is required.

--


More information about the Digitalmars-d-bugs mailing list