<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </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 - Missed guaranteed copy elision in delegating constructor with ?: operator"
   href="https://bugs.llvm.org/show_bug.cgi?id=40245">40245</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Missed guaranteed copy elision in delegating constructor with ?: operator
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>7.0
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </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++'17
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>john@jmdtech.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, erik.pilkington@gmail.com, llvm-bugs@lists.llvm.org, richard-llvm@metafoo.co.uk
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Created <span class=""><a href="attachment.cgi?id=21300" name="attach_21300" title="reproducible source code">attachment 21300</a> <a href="attachment.cgi?id=21300&action=edit" title="reproducible source code">[details]</a></span>
reproducible source code

This particular case of a missed guaranteed copy elision prevents clang from
compiling libstdc++ std::optionals with types that are not trivially copyable.
The example reproducible source is a minimization of the implementation of
std::optional in libstdc++.

<a href="https://gcc.godbolt.org/z/5gK3So">https://gcc.godbolt.org/z/5gK3So</a>

The problem appears to be that clang is missing its obligation to elide the
copy in the delegating constructor that uses the ternary operator to choose
between two constructors to delegate to. The ternary (?:) operator is defined
as a prvalue, so I believe this should qualify for the guaranteed copy elision
in c++17.</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>