https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120775
--- Comment #21 from Desmond Gold <cooky.ykooc922 at gmail dot com> ---
Bug #2: results in an error when using a constexpr structured binding to a
constexpr object whose subobjects are consteval-only (reflection value).
using info = decltype(^^int);
struct Point {
int x;
int y;
};
struct Info {
info i;
info j;
};
struct Mixed {
int x;
info j;
};
void foo() {
constexpr Point p {3, 4};
constexpr auto [px, py] = p;
static_assert(px == 3);
static_assert(py == 4);
constexpr Info i {^^::, ^^int};
constexpr auto [i1, i2] = i;
static_assert(i.i == ^^::);
static_assert(i.j == ^^int);
static_assert(i1 == ^^::); // error
static_assert(i2 == ^^int); // error
constexpr Mixed m {4, ^^::};
// constexpr auto [m1, m2] = m; (another ICE :<)
constexpr int arr[] {6, 7};
constexpr auto [arr0, arr1] = arr;
static_assert(arr0 == 6);
static_assert(arr1 == 7);
constexpr info info_arr[] {^^::, ^^int};
constexpr auto [ii1, ii2] = info_arr;
static_assert(info_arr[0] == ^^::);
static_assert(info_arr[1] == ^^int);
static_assert(ii1 == ^^::); // error
static_assert(ii2 == ^^int); // error
}
<source>: In function 'void foo()':
<source>:29:22: error: non-constant condition for static assertion
29 | static_assert(i1 == ^^::);
| ~~~^~~~~~~
<source>:29:19: error: the value of 'i1' is not usable in a constant expression
29 | static_assert(i1 == ^^::);
| ^~
<source>:25:21: note: 'i1' used in its own initializer
25 | constexpr auto [i1, i2] = i;
| ^~
<source>:30:22: error: non-constant condition for static assertion
30 | static_assert(i2 == ^^int);
| ~~~^~~~~~~~
<source>:30:19: error: the value of 'i2' is not usable in a constant expression
30 | static_assert(i2 == ^^int);
| ^~
<source>:25:25: note: 'i2' used in its own initializer
25 | constexpr auto [i1, i2] = i;
| ^~
<source>:45:23: error: non-constant condition for static assertion
45 | static_assert(ii1 == ^^::);
| ~~~~^~~~~~~
<source>:45:19: error: the value of 'ii1' is not usable in a constant
expression
45 | static_assert(ii1 == ^^::);
| ^~~
<source>:41:21: note: 'ii1' used in its own initializer
41 | constexpr auto [ii1, ii2] = info_arr;
| ^~~
<source>:46:23: error: non-constant condition for static assertion
46 | static_assert(ii2 == ^^int);
| ~~~~^~~~~~~~
<source>:46:19: error: the value of 'ii2' is not usable in a constant
expression
46 | static_assert(ii2 == ^^int);
| ^~~
<source>:41:26: note: 'ii2' used in its own initializer
41 | constexpr auto [ii1, ii2] = info_arr;
|
https://godbolt.org/z/hq1rf7aKv