gcc 4.9.2 -Wmissing-field-initializers 中的错误?
gcc 4.9.2 bug in -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++ 在第一个警告中抱怨 LogEntries::sDateTime
然后警告消失了。
当我删除 std::atomic<bool>
行时,警告也消失了。代码很简单;当你有 g++ 4.9.2 时检查一下 - 它真的很奇怪。
编辑: 无论我向哪个 LogEntries struct
成员添加 {}
初始化程序,警告都消失了。
如何解释这种行为?对我来说这是一个错误...
PS:
我认为这是一个错误:
将此行中的数组说明符更改为 1000:
LogEntries leLogEntries [1000] {};
g++ 将产生 5'000 个警告!我认为对每个数组值重复警告真的没有意义。
更新:
第一种情况现在已被 GNU 确认这是一个错误,但已在 gcc 5.0 中修复
ICE [内部编译器错误] 现在在错误数据库中 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
实现中的问题?
我在这段代码中遇到问题 - 可以将其复制 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 个警告!我认为对每个数组值重复警告真的没有意义。
更新:
第一种情况现在已被 GNU 确认这是一个错误,但已在 gcc 5.0 中修复
ICE [内部编译器错误] 现在在错误数据库中 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
实现中的问题?