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

Reply via email to