[Issue 14638] New: The last (in lexical order) copy of an object must be a move

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Sun May 31 21:31:46 PDT 2015


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

          Issue ID: 14638
           Summary: The last (in lexical order) copy of an object must be
                    a move
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: DMD
          Assignee: nobody at puremagic.com
          Reporter: andrei at erdani.com

Consider (also http://dpaste.dzfl.pl/87e95af25781):

struct S1
{
    this(this) { assert(0); }
}

struct S2
{
    @disable this(this);
}

void fun(S1 s)
{
    gun(s);
}

void gun(S1 s)
{
}

void hun(S2 s)
{
    iun(s);
}

void iun(S2 s)
{
}

void main()
{
    fun(S1());
    hun(S2());
}

This code creates an S1 and an S2 as rvalues and passes them by value into
functions. These functions in turn forward the values to other functions, also
by value, after which they make no more use of the values.

If a conversion to an rvalue is the last (statically determined) operation on a
value in the lexical scope of a variable, then that copy should count as a
move. That should be guaranteed, not an optimization.

This rule would automatically enable a lot of sensible code to work with
noncopyable values.  This matter is a semi-blocker for std.allocator because
most allocators are noncopyable.

BTW this does not need to go into guessing the last dynamic use. For example:

void hun(S2 s)
{
    iun(s); // last dynamic use
    if (false)
    {
        writeln(s); // last static use
    }
}

In this case, the call to iun() may create a copy even though an analysis shows
the last static use can never happen. Eliding the last dynamic copy may be
implemented as an optimization. Checking for @disable should still be inserted
regardless of the optimization.

--


More information about the Digitalmars-d-bugs mailing list