<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 - calls to operator delete(..., const std::nothrow_t &) are optimized out"
   href="https://bugs.llvm.org/show_bug.cgi?id=42564">42564</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>calls to operator delete(..., const std::nothrow_t &) are optimized out
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>trunk
          </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++
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>miod@trust-in-soft.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>blitzrakete@gmail.com, dgregor@apple.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=22220" name="attach_22220" title="simple testcase">attachment 22220</a> <a href="attachment.cgi?id=22220&action=edit" title="simple testcase">[details]</a></span>
simple testcase

When a nothrow placement new flavour is used to allocate and initialize an
object, and the object's constructor throws an exception, the matching nothrow
delete operator must be invoked.

However, as soon as optimization is turned on, calls to these operators are
removed.

Consider the following trivial code:

#include <cstdio>
#include <new>

void operator delete(void *, const std::nothrow_t &) noexcept { printf("delete
nothrow\n"); }
void operator delete[](void *, const std::nothrow_t &) noexcept {
printf("delete[] nothrow\n"); }

struct A { A() { throw 42; } };

int
main(int argc, char *argv[])
{
    try { A *a = new(std::nothrow) A; } catch (...) { }
    try { A *arr = new(std::nothrow) A[2]; } catch (...) { }
}


$ clang++ -O0 -fexceptions test.cpp && ./a.out
delete nothrow
delete[] nothrow
$ clang++ -O2 -fexceptions test.cpp && ./a.out
$

Tested with 7.0, 8.0 and today's godbolts' trunk on linux/x86_64.

FWIW, g++ -O0 and -O2 compile this correctly (with the operators being
invoked).</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>