gcc 4.9.2 -Wmissing-field-initializers中的错误?

时间:2015-03-21 15:25:57

标签: c++ c++11 gcc gcc-warning

我在这段代码中有一个问题 - 可以将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 ++在关于LogEntries::sDateTime的第一次警告中抱怨,警告也就消失了。

当我删除std::atomic<bool>行时,警告也消失了。代码很简单;当你有g ++ 4.9.2检查出来时 - 它真的很奇怪。

编辑:无论我添加LogEntries struct初始化程序的{}成员,警告都消失了。

如何解释这种行为?对我来说这是一个错误......

PS: 我认为这是一个错误: 将此行中的数组说明符更改为1000:

    LogEntries              leLogEntries [1000] {};
g ++将产生5&000; 000警告!我认为重复每个数组值的警告没有意义。

1 个答案:

答案 0 :(得分:2)

<强>更新

第一个案例现在已经被GNU确认,这是一个bug,但已在gcc 5.0中修复

ICE [内部编译器错误]现在位于错误数据库中 GNU bug database

这似乎是一个错误。我现在正在玩一下,我在修改后得到编译器消息gcc因内部错误而停止。

UPDATE:按要求提供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行时,它可以正常工作 - &gt; std::atomic实施中的问题?