<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/73232>73232</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang reports an undefined function that has been defined
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:frontend,
            libstdc++
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          tbaederr
      </td>
    </tr>
</table>

<pre>
    Not sure how to title this properly.

The original reproducer is just:

```c++
#include <string>
constexpr auto z = std::string("", 0);
```
with libstdc++.


Using cvise, I get:
```c++
template <typename _CharT>
struct basic_string {
 constexpr void _M_construct();

  constexpr basic_string() {
 _M_construct();
  }

};

void operators() {
 basic_string<char *>{};
}

template <typename _CharT>
constexpr void basic_string<_CharT>::_M_construct(){}

constexpr basic_string<char*> z{};
```
https://godbolt.org/z/7PzreExcf

Clang's output is:

```console
<source>:18:16: error: constexpr variable 'z' must be initialized by a constant expression
   18 | constexpr auto z = basic_string<char *>();
      |                ^ ~~~~~~~~~~~~~~~~~~~~~~
<source>:6:5: note: undefined function '_M_construct' cannot be used in a constant expression
    6 | _M_construct();
      |     ^
<source>:18:20: note: in call to 'basic_string()'
   18 | constexpr auto z = basic_string<char *>();
 |                    ^~~~~~~~~~~~~~~~~~~~~~
<source>:3:18: note: declared here
    3 |   constexpr void _M_construct();
      | ^
```

The problem vanishes if `operators()` is commented out, or if `basic_string` is not a template anymore.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVcGS4jgM_RrnohoqsQmBQw40NFV72K09zJ67nFgQTzl2ylZ6Bg777VtOmCZh6N4-jMs4xJElvSdLkiHok0UsWf7E8n0ie2qcL6mSqND7pHLqXP7lCELvERr3HcgBaTII1OgAnXcdenNesHTP0u24fm0QnNcnbaUBj513qq_Rgw7wrQ_ExHYqzVbpOGvGn-Icd7nQtja9QmBiF8hre2LiefxYOxsIf3QeZE8OLsDEHgKpqFlsr8J8zTgf5g5SxjdMPN0ZHF-_a2rA6CqQunowAzOu_wRtT1C_6oBR3x9wwgmOhwgI285IGvync4dWtggvu0b6r29AAvm-Jqhk0PXL6Dew4qoAbjBfnVbw8ufLsBOPDOgmkMYDkxNTlaPwRPEHmgBYsZ_hL_Z3ZgZnYtglOR9-UT6zLHZ1Iz0wvo2Yi6eZtrmhz_B1x8idqZvwcA8eoBwdmBh9h7DR7dFruNz7Pb8_DVEXokV-YPxwcqpyhhbOnxg_XBg_FH9fPD7_qI9TuzsjY1yKAK6nrifQ4d20cDY4g9ddsQuu9zWOKLN1XFZMbAG9dz7-mXAkvZaVQWC8uDBeQNsHggpBW01aGn1BBdUZ5HhGWoJ4DkPQzv68DpCtgRU7eJhzH8T6_lrFEfXcDZY_w78Px0PAEWoeUVpHGJ-9VXjUFhUce1uTdjainYe-gFpa6wbofUAF2v4PZlgNvn6YJ1NALH9-Pz48nTqsLdTSmFhHGS9-TVPGi99M_QPWrz5_nnfxE8wbDoW1kR4VNOjxxom4mvt87boxeWNxnmG3rtJ5Vxls4VVaHRoMoI_AVuldMWKrNPaa2rUtWkIVcyxWbeev8jPuRuF4PSS81SBpz63zuEhUKdRGbGSCZVakaSE2eSaSpjzyDc8zXhxFna6WebVeykJlqyrjuCzEskp0yVMusiz-xFqIRbZUCqsVzxUX-bKWbJliK7VZGPPaxnqR6BB6LAvBBU-MrNCEoS1zXg_VQmyP3llCq8auxjifta24m-8TX0aFX6r-FNgyNTpQuJkYWnc5VJ_YmZ2nANI-yiJqJEEjA1SIFq6fk96b8q7gaWr6alG7lvFDtHN9fOm8-4Yx2ocBV4ilMEL7LwAA___FRoSw">