<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/117294>117294</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] Placement-new in constant evaluation can give indeterminate result
</td>
</tr>
<tr>
<th>Labels</th>
<td>
c++20,
clang:frontend,
c++26,
constexpr
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
frederick-vs-ja
</td>
</tr>
</table>
<pre>
The following program shouldn't be accepted per [[expr.const]/5.18.2.1](https://eel.is/c++draft/expr.const#5.18.2.1) as corrected by [CWG2922](https://cplusplus.github.io/CWG/issues/2922.html) (since the constructed array type is unsuitable).
However, Clang currently accepts it and give different results in different compilation. [Godbolt link](https://godbolt.org/z/asjev19vj).
```C++
#include <new>
#include <typeinfo>
constexpr int N = []
{
struct S {
int a[1];
};
S s;
::new (s.a) int[1][2][3][4]();
return s.a[0];
}();
template<int X>
struct tag {};
void unknown(const std::type_info&) noexcept;
int main()
{
unknown(typeid(tag<N>));
}
```
Moreover, the following seems valid because the array type is suitable, but there are still indeterminate results. [Godbolt link](https://godbolt.org/z/5bPfns185).
(The correct `N` is `0`.)
```C++
#include <new>
#include <typeinfo>
constexpr int N = []
{
struct S {
int a[1];
};
S s;
::new (s.a) int[1](); // s.a is converted to the poiner to s.a[0]
return s.a[0];
}();
template<int X>
struct tag {};
void unknown(const std::type_info&) noexcept;
int main()
{
unknown(typeid(tag<N>));
}
```
This can be also trigged by the current resolution of [LWG3436](https://cplusplus.github.io/LWG/issue3436) (so labled `c++20`).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVs1u4zYQfhr6MoggjX5sHXyI7To9bBcLbID0VlDiSGZCkwJJKZs-fUFKWdtBgBa9toZNWRxyfr6Zj0PunOw10ZaVO1YeVnz0J2O3nSVBVrYvd5O7e-arxoi37eOJoDNKmVepexis6S0_gzuZUQnNcO2hIeBtS4MnAQNZiEp39GOwSWu086w8MDyWSbZJMMni2-bk_eBYfs_wyPBIpBLpGB5bhjuGO2F558P8RQfmPxVgDdxBa6ylNths3oLJ_dMD1oifqW8HNbrwS3rpT2OTSMPwuH96YHiUzo0UTIfNycmfVdDPcOOkbgn8iSA6YMdoi1vL38C_DQTSwajdKD1vFDGsE5YeWHo_j7-aV5rIMtzDXnHdQztaS9qrtwUrB9ID1wJ6OREI2XUU5GDJjSpI9dVka86DVNxLo5MQ64MRjVEelNQvnwXcz_LE2J7h8U-GR-6eacrq6fmjo6xK5-9-hn6ZxVzqVo2CgOV7Ta8s_-UzSQBC6s5cxHGMiIXkgdQevgLLD3NVHJZV68UOAMCMLXyHm9nwCZs5K3exZvIrIVvfvn8HdyvP71l-r-k1JjLhIaVS-3dV5Q7nRz4_ihlDhvWNFkt-tBrC_nKXXvsQ7N-un0dP50FxTyzfB99__wnLEqPnfYzyyv15nIwUMOoXbV41w03ED5wXcyAB5T8izFiFULShH6GGPigJJs9c6sW1D0hftMekifCH9yzffw1eYn0TzfrwoTqu7fxmLJmluP3N6eCIzg4mrqSAhlo-uplBt6y5cGYPzejDChvWEDgvlQKpBXmyZ6m5p3dC_Mu6L5tvnXbZpryqe9w8RlbH8wNYlX5lVRocY1UaYk0u6P1nKfJe3TADG0gQEGqNnsiGg9CbmNnBSE02vF3R5H8G_Q2DHk8BS65j61TOgLey7-dWFjvO3CxC7Rs1hmMfTBfK48vTQ17k1T9vcl8uTS5uXHqbARUYKELJLz0Xo5NYJyuxzUWd13xF22ydI5brMs1Xp222KTYVEl_XDS-LTSU2XZWlVZEJIbqsECu5xRSLLENMq3yDedJ1RV00vKrW66wSZcGKlM5cqkSp6RxYuoqebbNsjXWxUrwh5eKlBPHiFiLDfZgJjZTl95012pMWF8GytLrMvLOLxRvBym6Dxbtm7B0rUiWddxcfvPQqXoVip2blAb4p3tKZtL8LBJF6vgJw7YEmrsbYiGP-YvP-7LxajVZtPxxOc1pac2Z4DMaXx91gzTO1_voysgAybfGvAAAA__9o1MxP">