https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59832

Matthijs van Duin <matthijsvanduin at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |matthijsvanduin at gmail dot 
com

--- Comment #13 from Matthijs van Duin <matthijsvanduin at gmail dot com> ---
I also just ran into this one with g++ 6.2.1.

Here are some interesting cases:

union Foo {
        union { int x; char y; } u;
        union { int x; char y; } v;
        int n;
};
std::vector<Foo> foo = {
        {},                     // ok
        { .u = {} },            // ok
        { .u = { .x = {} } },   // ok
        { .u = { .x = 0 } },    // ok
        { .u = { .y = {} } },   // ICE in reshape_init_class
        { .u = { .y = 0 } },    // ICE in reshape_init_class
        { .v = {} },            // ok
        { .v = { .x = {} } },   // ICE in reshape_init_class
        { .v = { .x = 0 } },    // ICE in reshape_init_class
        { .v = { .y = {} } },   // ICE in reshape_init_class
        { .v = { .y = 0 } },    // ICE in reshape_init_class
        { .n = {} },            // ok
        { .n = 0 },             // error: could not convert
};

Some more observations:
- Replacing the inner unions by structs results in the same errors (in addition
to some warnings for missing initializers)
- No errors occur if a C-style array is initialized instead of std::vector
- It doesn't matter if the inner aggregates are anonymous or not.

Similar things with an outer struct:

struct Bar {
        union { int x; char y; } u;
        union { int x; char y; } v;
};
std::vector<Bar> bar = {
        { .u = {}, .v = {}         },   // ok
        { .u = {}, .v = { .x = 0 } },   // ok
//      { .u = {}, .v = { .y = 0 } },   // ICE in reshape_init_class
        { .u = { .x = 0 }, .v = {} },   // ok
//      { .u = { .y = 0 }, .v = {} },   // ICE in reshape_init_class
//      { .v = { .x = 0 }, .u = {} },   // ICE in reshape_init_class
//      { .v = {}, .u = { .x = 0 } },   // ICE in reshape_init_class
//      { .v = {},         .u = {} },   // sorry, unimplemented
};

Reply via email to