https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94149
Bug ID: 94149
Summary: __is_constructible doesn't know about C++20
parenthesized init for arrays
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
In C++20 this is well-formed:
using T = int[2];
T t(1, 2);
which means that std::is_constructible_v<int[2], int, int> should be true.
The FE intrinsic gives the wrong answer, and the std::is_nothrow_constructible
library trait isn't going to work even if the intrinsic starts to give the
right answer.
i.e. this should compile with -std=gnu++2a
#include <type_traits>
int main()
{
using T = int[2];
T t(1, 2);
static_assert(__is_constructible(T, int, int));
static_assert(std::is_constructible_v<T, int, int>);
static_assert(std::is_nothrow_constructible_v<T, int, int>);
return t[0];
}
a.cc: In function 'int main()':
a.cc:8:17: error: static assertion failed
8 | static_assert(__is_constructible(T, int, int));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:9:22: error: static assertion failed
9 | static_assert(std::is_constructible_v<T, int, int>);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:10:22: error: static assertion failed
10 | static_assert(std::is_nothrow_constructible_v<T, int, int>);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~