2016-03-06 3 views
5

g ++ verwenden und mit -Waggregate-returnversucht zu schweigen -Weggregate-Return nur in einem Makro für g ++ - Buggy Compiler?

#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 

aber die abgerollt von Hand Version Warnungen nicht produzieren Kompilieren:

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

Sollte das Verhalten nicht gleich sein?

Ich glaube nicht, dass die Result und ExpressionDecomposer Typen zählen - nur Klassen.

Ich versuche, Expression-Dekomposition funktioniert wie here (Dinge wurden ein bisschen umbenannt).

EDIT: >>here < < ist eine Live-Demo des Problems mit der damit Bibliothek

Meine Frage ist: Warum? Wie kann ich im ersten Fall mit dem Makro kostenlos warnen? Ich kann es mir nicht leisten, die Warnung global zum Schweigen zu bringen.

+0

Ich weiß, dass dies die Frage nicht beantwortet, aber "-Weggregate-Return" scheint ziemlich pedantisch und sollte ignoriert werden, besonders in C++, wo die Rückgabe per Wert völlig normal ist. Sie können sich [diese Frage] ansehen (http://stackoverflow.com/questions/14016993/confusion-in-regrates-to-purpose-behavior-of-waggregate-return). –

+1

Ich erinnere mich vage daran, dass GCC Probleme mit Pragmas in Makros hat; Vielleicht möchten Sie ihre Bugzilla suchen. –

+0

@AlexandreC. Ich würde diese Warnung nie für persönlichen Code verwenden, aber die Bibliothek, die ich schreibe, soll sogar auf den aggressivsten Ebenen komplett warnen (ich leide an Perfektionismus) ... Auch diese Warnung ist nicht in '' -Wall' '' '' '' '-Wextra''' aus gutem Grund ... – onqtam

Antwort

1

Diese Fehler suchen relevant:

So könnte es haben mit Zeilennummer Vergleiche zu tun, oder einige ähnliches Problem innerhalb des Parsers, und es könnte in einigen zukünftigen v behoben werden ersion.

+0

wow das scheint ziemlich allgemein ... so weit habe ich nur clang Warnungen mit '' '_Pragma''' zum Schweigen gebracht und es funktioniert gut dort ... komisch, dass gcc würde nicht so gut funktioniert so lange – onqtam

+0

@onqtam es funktioniert gut außerhalb eines Makros, und entsprechend der ersten Bug-Repory, auch in C. Gcc Bugs behoben werden, basierend auf dem Interesse hat jemand in der Festsetzung der Fehler; ein bisschen Werbung tut nicht weh, aber es gibt viel ältere ungelöste Fehler. Warnung Bugs sind in der Regel nicht kritisch, afaik. – rici

+0

@onqtam übrigens, müssen Sie 'expr' in diesem Makro (wo es verwendet wird, nicht im Prototyp.) – rici

-2

Sie könnten versuchen:

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

werden nicht einmal kompilieren – onqtam

Verwandte Themen