试图仅在 g++ 的宏中使 -Waggregate-return 静音 - 错误的编译器?

trying to silence -Waggregate-return only in a macro for g++ - buggy compiler?

使用 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 一样工作(已经稍微重命名了)。

编辑: >> here << 是使用 lest 库的问题的现场演示

我的问题是:为什么?在使用宏的第一种情况下,我怎样才能不发出警告?我不能在全球范围内消除警告。

你可以试试:

#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)

这些错误看起来相关:

所以它可能与行号比较或解析器中的一些类似问题有关,并且它可能会在未来的某个版本中得到修复。