Ошибка gcc 4.9.2 в -Wmissing-field-initializers?

У меня есть проблема в этом коде, который можно скопировать 1: 1 в файл cpp, чтобы проверить его поведение:

#include <atomic>

typedef struct
{
    char                sDateTime [20];
    char                sLogFileDirectory [300];
    char                sLogFileNameTemplate [300];
    char                sLogOutput [10][100];
    std::atomic<bool>   bReadyToFlush;
} LogEntries;

typedef struct
{
    LogEntries              leLogEntries [1] {};
} LogThreads;

При компиляции с помощью gcc 4.9.2 SLES 11 SP2 g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -c я получаю очень странные предупреждения:

gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sDateTime’ [-Wmissing-field-initializers]
  LogEntries    leLogEntries [1] {};
                                  ^
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileDirectory’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogFileNameTemplate’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::sLogOutput’ [-Wmissing-field-initializers]
gcc-warning-bug.cpp:18:34: warning: missing initializer for member ‘LogEntries::bReadyToFlush’ [-Wmissing-field-initializers]

Добавление инициализатора {} в эту строку

std::atomic<bool>   bReadyToFlush {};

даже g++ жалуется в 1-м предупреждении на LogEntries::sDateTime, тогда предупреждения исчезают.

Предупреждение также исчезает, когда я удаляю строку std::atomic<bool>. Код очень прост; когда у вас есть g++ 4.9.2 проверьте это - это действительно очень странно.

EDIT: независимо от того, к какому элементу LogEntries struct я добавляю инициализатор {}, предупреждения исчезают.

Как можно объяснить такое поведение? Для меня это баг...

PS: Я считаю это ошибкой: измените спецификатор массива в этой строке на 1000:

    LogEntries              leLogEntries [1000] {};

g++ выдаст 5000 предупреждений! Я бы предположил, что нет смысла повторять предупреждение для каждого значения массива.


person Peter VARGA    schedule 21.03.2015    source источник
comment
Как насчет написания кода в стиле C++? (typedef struct { ... } name; нельзя найти ни в одном известном мне учебнике по C++)   -  person Walter    schedule 21.03.2015
comment
@Walter: Это проект, впервые написанный на чистом коде C для CUDA от NVIDIA. Поскольку CUDA 7.0 был выпущен в прошлый вторник, я сейчас шаг за шагом переношу код в стандарт C++11. Спасибо за замечание, но сейчас это не главное.   -  person Peter VARGA    schedule 21.03.2015
comment
@Walter: я согласен с Алом. Внесение предложенного вами тривиального изменения не меняет поведения компилятора. Определение структуры OP, в конце концов, является допустимым C++.   -  person TonyK    schedule 21.03.2015
comment
@TonyK Это был не ответ, а просто комментарий. Конечно, это не имеет прямого отношения к вопросу.   -  person Walter    schedule 23.03.2015


Ответы (1)


ОБНОВЛЕНИЕ:

Первый случай теперь подтвержден GNU, это ошибка, но она уже исправлена ​​в gcc 5.0

Внутренняя ошибка компилятора ICE теперь находится в базе данных ошибок база данных ошибок GNU

Кажется, это ошибка. Теперь я немного поиграл, и после модификации я получаю сообщение компилятора, которое gcc остановилось из-за внутренней ошибки.

ОБНОВЛЕНИЕ: В соответствии с запросом код, который не может быть скомпилирован gcc. Параметры компилятора: g++ -std=c++11 gcc-warning-bug.cpp -Wall -Wextra -Werror -fno-strict-aliasing -fwrapv -fno-aggressive-loop-optimizations -c — некоторые параметры присутствуют, потому что GNU запрашивает отчет об ошибке.

#include <atomic>

class LogEntries
{
public:
    char                sDateTime [20];
    std::atomic<bool>   bReadyToFlush;
};

class LogThreads
{
public:
    static LogEntries   leLogEntries [10];
};

LogEntries LogThreads::leLogEntries [10] {};

Компилятор терпит неудачу с этим выводом:

gcc-warning-bug.cpp:16:43: internal compiler error: in gimplify_init_constructor, at gimplify.c:4007
....
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.

Я подготовлю пример кода и отправлю его команде разработчиков. В моем проекте элемент leLogEntries является статическим.

Когда вы удаляете строку std::atomic, она работает --> проблема в реализации std::atomic?

person Peter VARGA    schedule 21.03.2015