<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - deleted move constructor ignored by return statement"
   href="https://llvm.org/bugs/show_bug.cgi?id=31025">31025</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>deleted move constructor ignored by return statement
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>All
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>C++11
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>cubbimew@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>dgregor@apple.com, llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>When returning a class lvalue with deleted move constructor, first phase of the
return statement's overload resolution selects that deleted move constructor
and results in an error in GCC, Intel, and MSVC. Clang, however, silently falls
through to the second phase overload resolution (and selects the copy ctor if
available):

struct B
{
    B() {};
    B(const B &) {}; 
    B(B &&) = delete;
};

B bar() {
  B b;
  return b; // OK in Clang, Error in GCC, Intel, MSVC
}

The relevant standardese is [class.copy]/32 "If the first overload resolution
fails ... " and it appears clang disagrees with others w.r.t. what it means for
overload resolution to "fail" in this context.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>