<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 - Clang incorrectly discards destructor if there is only a constant evaluated branch"
   href="https://bugs.llvm.org/show_bug.cgi?id=48587">48587</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang incorrectly discards destructor if there is only a constant evaluated branch
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>11.0
          </td>
        </tr>

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

        <tr>
          <th>OS</th>
          <td>Windows NT
          </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++2a
          </td>
        </tr>

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

        <tr>
          <th>Reporter</th>
          <td>mschellenbergercosta@googlemail.com
          </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>This is an issue that came up with the implementation of constexpr vector and
constexpr string for MSVCs standard library.

The regression is that the destructor of iterators is not executed properly,
which lets the iterator debug machinery of the STL crash. 

A minimal reproducer of he issue is the following code:

```
struct conditionalDestructor {
    constexpr conditionalDestructor(int& val_) noexcept : val(val_) {}
    constexpr ~conditionalDestructor() noexcept {
        if (!__builtin_is_constant_evaluated()) {
            ++val;
        }
    }

    int& val;
};

int main() {
    int destructorsCalled = 0;
    {
        [[maybe_unused]] volatile conditionalDestructor
test(destructorsCalled);
    }
    if (destructorsCalled != 1) {
        return -1;
    }
}
```

Here, the destructor of `conditionalDestructor` is never executed, despite it
being runtime only.

Note that if there is code in the else branch of the
`__builtin_is_constant_evaluated` clause, the destructor is not discarded.</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>