2015-03-21 2 views
1

У меня есть проблема в этом коде - который можно скопировать 1: 1 в файл CPP, чтобы проверить Behaving:gcc 4.9.2 ошибка в -Wmissing-field-инициализаторы?

#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 {}; 

даже г ++ жалуется на 1-е предупреждение о LogEntries::sDateTime, тогда предупреждения ушли.

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

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

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

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

LogEntries    leLogEntries [1000] {}; 

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

+0

Как насчет написания кода стиля С ++? ('typedef struct {...} name; 'не может быть найден ни в одном учебнике C++, о котором я знаю) – Walter

+0

@Walter: Это проект, написанный сначала в чистом коде C для CUDA от NVIDIA. Поскольку CUDA 7.0 был выпущен в прошлый вторник, я теперь шаг за шагом переводил код в стандарт C++ 11. Спасибо за замечание, но на данный момент это не главное. –

+0

@ Уолтер: Я согласен с Аль. Создание тривиального изменения, которое вы предлагаете, не изменяет поведение компилятора. Определение структуры OP после всех допустимых C++. – TonyK

ответ

2

UPDATE:

1-ый случай, теперь подтверждается GNU это ошибка, но уже исправлена ​​в НКУ 5,0

ДВС [Internal Compiler Error] теперь в базе данных ошибокGNU bug database

Кажется, ошибка. Я теперь немного поиграл, и после модификации я получил сообщение о компиляторе 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?

+0

Можете ли вы показать нам код тоже, пожалуйста? – TonyK

+0

@TonyK: Я обновил ответ с помощью кода. –