LINUX.ORG.RU

Это баг в GCC 11.2 или я что-то упустил?


0

1

После обновы до 11.2 столкнулся с тем, что следующий код перестал компилироваться:

#include <iostream>
using namespace std;

#pragma pack(1)
struct RGBA {
    union {
        uint32_t word;
        struct {
            uint8_t r;
            uint8_t g;
            uint8_t b;
            uint8_t a;
        } rgba;
};
};
#pragma pack()

const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREEN = { .rgba = { 0x00, 0xff, 0x00, 0xff } };
const RGBA RGBA_BLUE  = { .rgba = { 0x00, 0x00, 0xff, 0xff } };
const RGBA RGBA_BLACK = { .rgba = { 0x00, 0x00, 0x00, 0xff } };
const RGBA RGBA_GREY  = { .rgba = { 0x80, 0x80, 0x80, 0xff } };
const RGBA RGBA_NONE  = { .rgba = { 0x00, 0x00, 0x00, 0x00 } };

int main(){
    auto color = RGBA_WHITE;
    cout << color.word << endl;
    color = RGBA_RED;
    cout << color.word << endl;
    return 0;
}

gcc 11.1 и ранее нормально компилируют, gcc 11.2 и trunk выдают ошибку:

source>:18:62: error: too many initializers for 'RGBA::<unnamed union>'
   18 | const RGBA RGBA_WHITE = { .rgba = { 0xff, 0xff, 0xff, 0xff } };
      |                                                              ^
<source>:19:62: error: too many initializers for 'RGBA::<unnamed union>'
   19 | const RGBA RGBA_RED   = { .rgba = { 0xff, 0x00, 0x00, 0xff } };
      |                                                              ^
★★★★★

clang с -pedantic-errors

test.cpp:8:5: error: anonymous types declared in an anonymous union are an extension [-Werror,-Wnested-anon-types]
    struct {
    ^
test.cpp:18:26: error: designated initializers are a C++20 extension [-Werror,-Wc++20-designator]
const RGBA RGBA_WHITE = {.rgba = {0xff, 0xff, 0xff, 0xff}};
alexandrovski
()
Ответ на: комментарий от alexandrovski

13-й шланг на годболте нормально всё откомпилировал.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от alexandrovski

А, у тебя педантик стоит. Но тем не менее, ошибка совсем другая и вполне понятная. Кстати, 11.1 с -pedantic тоже нормальную ошибку даёт.

WatchCat ★★★★★
() автор топика
Последнее исправление: WatchCat (всего исправлений: 2)
Ответ на: комментарий от peregrine

Ну в общем да, говнокод - нахрена анонимный union в структуре?

Другое дело, что gcc как-то недофиксили.

WatchCat ★★★★★
() автор топика

ошибка для случая, когда инициализируешь сразу несколько полей у union. Но тут-то такого не происходит. Кстати ошибка вроде как исчезает, если поменять местами word и rgba.

Действительно похоже на баг в компиляторе.

Lrrr ★★★★★
()

вроде как в С++ нельзя пропускать именованные поля

в С можно и так же можно их еще и использовать в любом порядке

anonymous
()
Ответ на: комментарий от SZT

Спасибо. Может конечно и лучше, но уже переделал структуру, так что всё работает и так.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от anonymous

вроде как в С++ нельзя пропускать именованные поля

По-моему можно, главное не менять последовательность их указания.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.