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

    <tr>
        <th>Summary</th>
        <td>
            C++20 constexpr std::complex errors
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Though `std::complex<>::operator+` (and others) are `constexpr` in C++20, the code below fails to compile.

```cpp
#include <complex>

constexpr std::complex<double> x{1, 2};
constexpr std::complex<double> y = x + x;
```

I am using libstdc++ and note that the `constexpr` declarations are in place there, and also that g++ does compile it. I am on Ubuntu 21.10. Clang trunk also fails. The error message is below. I suspect it relates to `constexpr` support for `__complex__`.

```
$ clang++ -c -std=c++20 complex-constexpr.cpp 
complex-constexpr.cpp:4:32: error: constexpr variable 'y' must be initialized by a constant expression
constexpr std::complex<double> y = x + x;
                               ^   ~~~~~
/usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/complex:1336:13: note: subexpression not valid in a constant expression
          _M_value += __z.__rep();
                   ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/complex:335:11: note: in call to '&__r->operator+=(x)'
      __r += __y;
          ^
complex-constexpr.cpp:4:38: note: in call to 'operator+(x, x)'
constexpr std::complex<double> y = x + x;
                                     ^
1 error generated.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFVU2PmzAQ_TXOZRQEJoTsgcMm2Ug99NaekYFZ4tbByB9t0l_fMR9JGm1XqtSqERiwZ8bvvRlPKt1cik9H7dsjsHVsXcPSZ7pqfeoVnlm6Y-nLOKV7NMJpw_iWLIHxjega0O6IxjL-BMJgCFHrzjo89yYYyQ52wZ5vecz4DsgYat0gVKj0d3gVUllwGsJ2UmHE4j2Ln6dxHY9X3ffTDE9lVytP_gTsCvHl3uu6PbzBpdG-UkgecGb5NgmIOMv3LN3-kfOFtt_DmSTYUqDZ-Yr3Hs4HECfwVnYtKFlR1HqUA4J2nXZIkgg36PKoXYO1EqS4pMlBXBKzV6IOLmgwgA9BhLJ6DNJOoRuNdlYUpItgAKE7-Fz5znngSZTEEeyUIFTO-O7rGGTIRgSfCAsaow2c0FrRUgw75itEst72WDuKCwaVcDjk7xG79X2vjYNXikLfZTnJWJb09XaW5xSvoA7AJi7LGpZDLvb1XEcwxVped4yoQmDO4BtrlMYV3SmnYaQWXm7J_iaMFJRbSmh-oRtO3jqiTIpLJ4WSP7CB6gJi9BGdg-BH6lBu_kLlwPs_lr2EMX_55ZrkOnhLJ_JQyY7GKKKB6ozGtibBDufNulyvlkp2_rxsO09TSTIbPgzT0aK3SerZ-ErkOUnT9fAI-oXqDU_rq5saYZb0VLIJ5fqOYDd65ceSHHxQfxvUKcsfUVka7KnDUF95TyVS5r_okKZZkCG5l4Ho1kKp4TTwnPE1cVhSzu_bZronTudAiizuSJHpjf3lDcZXou_W9-b3eO5RDBB28AuOf1m_DxSSqbu02AVM2EQPnWDRFGnzlD6JhZNOYbG7O_m_QznGtAtvVHF0rrdhlR9CAUh39FVEdqEm1Lf5seyN_kKdLGTcWo_0H3bIsjSPF8dCJFWe5SuOdcbpdY1VkvFNvlmlcbXBJFsoQQ3RFizbsmy_kAWPOY-zJE44z5N1VK9eN1kcP8UcMX5dZWwV44m6axQ2jrRpF6YYMFS-tbSopHX2tijonLQd4hxfeHfUpui_ojSLAWwxIP0JhONEAA">