<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 constructor of global variable"
   href="https://bugs.llvm.org/show_bug.cgi?id=48585">48585</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang incorrectly discards constructor of global variable
          </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 constructor of vector (or string) 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 container_proxy {};

struct container_base {
    constexpr void alloc_proxy() {
        if (!__builtin_is_constant_evaluated()) {
            proxy = &storage;
        }
    }
    container_proxy storage; // Must be a struct, compiles fine with int
    container_proxy* proxy = nullptr;
};

struct container {
    constexpr container() {
        data.alloc_proxy(); //The call to this function is ommited
    }
    container_base data;
};

container globalVariable;

int main() {
    if (globalVariable.data.proxy == nullptr) {
        return -1;
    }
}
```

I would expect, that global variables that are not constant expressions are
still constructed correctly.

As a side note, the code executes fine if the container_proxy struct is
replaced by a POD type such as int.</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>