试图沉默-Waggregate-只返回一个宏的g ++ - buggy编译器?

时间:2016-03-06 14:59:46

标签: c++ g++ compiler-warnings suppress-warnings compiler-bug

使用g ++并使用-Waggregate-return

进行编译
#define DOCTEST_CHECK(expr)                                      \
    do {                                                         \
        _Pragma("GCC diagnostic push");                          \
        _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\
        if(Result failed = (ExpressionDecomposer() << expr))     \
            printf("%s\n", failed.m_decomposition.c_str());      \
        _Pragma("GCC diagnostic pop");                           \
    } while(false)

DOCTEST_CHECK(true == false); // produces warnings

但是手动展开的版本不会产生任何警告:

do {                                                                                           
    _Pragma("GCC diagnostic push");                                                            
    _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");                                  
    if(Result failed = (ExpressionDecomposer() << true == false))     
        printf("%s\n", failed.m_decomposition.c_str());                                        
    _Pragma("GCC diagnostic pop");                                                             
} while(false);

行为应该不一样吗?

我认为ResultExpressionDecomposer类型不重要 - 只是类。

我正在尝试让表达式分解像here一样工作(事情已被重命名)。

编辑:&gt;&gt; here&lt;&lt;是使用lest库

的问题的现场演示

我的问题是:为什么?如何使用宏在第一种情况下自由警告?我不能在全球范围内消除警告。

2 个答案:

答案 0 :(得分:1)

这些错误看起来很相关:

因此,它可能与行号比较或解析器中的某些类似问题有关,并且可能会在以后的某个版本中修复。

答案 1 :(得分:-2)

你可以尝试:

#define DOCTEST_CHECK(expr)                                      \
do {                                                         \
    _Pragma("GCC diagnostic push");                          \
    _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\
    if(Result failed = (ExpressionDecomposer() << (expr)))     \
        printf("%s\n", failed.m_decomposition.c_str());      \
    _Pragma("GCC diagnostic pop");                           \
} while(false)