<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126558>126558</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] Cannot use a static constexpr/consteval member function to initialize a static constexpr member
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
YexuanXiao
</td>
</tr>
</table>
<pre>
I've noticed that consteval member functions exhibit very strange behavior—they can initialize static non-constexpr members but fail to work for static constexpr members.
Example ([Godbolt](https://godbolt.org/z/Ynn5xf78s)):
```cpp
struct A
{
static inline constexpr bool test_constexpr() noexcept
{
return true;
}
static inline constexpr bool t_expr = test_constexpr(); // can't compile
static inline constexpr bool test_consteval() noexcept
{
return true;
}
static inline constexpr bool t_eval = test_consteval(); // can't compile
static inline bool t_non_const = test_constexpr();
};
inline constexpr bool t_expr = A::test_constexpr();
inline constexpr bool t_eval = A::test_consteval();
```
Output:
```cpp
<source>:8:34: error: constexpr variable 't_expr' must be initialized by a constant expression
8 | static inline constexpr bool t_expr = test_constexpr();
| ^ ~~~~~~~~~~~~~~~~
<source>:8:43: note: undefined function 'test_constexpr' cannot be used in a constant expression
8 | static inline constexpr bool t_expr = test_constexpr();
| ^
<source>:3:34: note: declared here
3 | static inline constexpr bool test_constexpr() noexcept
| ^
<source>:15:34: error: constexpr variable 't_eval' must be initialized by a constant expression
15 | static inline constexpr bool t_eval = test_consteval();
| ^ ~~~~~~~~~~~~~~~~
<source>:15:43: note: undefined function 'test_consteval' cannot be used in a constant expression
15 | static inline constexpr bool t_eval = test_consteval();
| ^
<source>:10:34: note: declared here
10 | static inline constexpr bool test_consteval() noexcept
| ^
2 errors generated.
Compiler returned: 1
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVk2P6yYU_TU3m6sZYbDHzsILJ5lUXXXbt3rC5iahJRABTjNv0d9eYSeZaDLzJqn68ZAlIxsu95x7gCND0GtLVEMxg2IxkX3cOF9_oUMv7a9auknr1Ev9M_ByT2hd1B0pjBsZsXM2RNpLg1vatuRx1dsuamcD0mGjWx1xT_4FQ_TSrglb2si9dh6eOVQMpnnc0At20qK2Ompp9DfCEGXUHVpnH8b4h50_xg_Y9hFXUhuMDv9w_ndcOX-acTX6EVjzfJDbnSEEXkEx-8mp1pkIxQJ4tYlxF0A0wJfAl-vx16Pza-DLb8CXX6wtDquyCsCn6RENsAae2Ph0ux2wJkTfdxGHP-UMWIOIp3y0NdrSRVqtcwYjhfj1_C2lxadoHR062sVjgNdQqXmKvbcYfU8gZuchi5tW-zr0QSzeXRjEDEf4qQrAy1TT7U4buhPKXpr_AEpS2hso54UTlHuwHGNaZ8dI3-NoqO5i7HzKc5OEIpqPQ30K7zrCJcpLEQJrfunjro_vihPEPLjedwTiGURTgWhEDqJB8t751HnNYS-9lu2wUcoRDPASt32I2NLF9lTYvqAcJ0obMY2kELSzR5YrhHKO_4Awz7I5xftug-L51P3zTXufiVwkAqyLlN69VbTSltT5CBuIeJNZmZRl3UBJH0ihtj8iF5ekXIMXZxmcwCvqjPSkcEP-tFnEjanfcJrdXsHrZLPiDtEOu-TviDYrbi7UJ0fQvyjagYo7VXtk5C7V_l9kfCIEdotsM3a3bD-8ue6SLR_lGXBNlryMpJL5mI_3jz_ee6RS2tnlQT1RtVBTMZUTqrNSTDmblqKabGrWKtYJyqcrap8yJZ9WvGB59cQlb8u8oomuOeMF4xnLyrwqysdMtXkhWsXkqlArpiBntJXaPBqz3yZbM9Eh9FRn_KkoqomRLZlwMn2-TqMe2n4dIGdGhxhe50UdzWAP50baNRQLnI-C6gOhvLJfwJcfGsPk2y683vXk44RJ7039xqDpuOnbx85tgS9TbsfXw86736iLwJcDwAB8ecS4r_lfAQAA__8gp1y6">