2016-03-06 29 views
5

utilizzando g ++ e la compilazione con -Waggregate-returncercando di silenziare -Waggregate-return solo in una macro per g ++ - compilatore buggy?

#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 

ma la srotolato dalla versione a mano non produce eventuali avvisi:

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

Non dovrebbe essere il comportamento stesso?

Non penso che i tipi Result e ExpressionDecomposer contino - solo le classi.

Sto cercando di ottenere la decomposizione delle espressioni che funziona come here (le cose sono state ridenominate un po ').

EDIT: >>here < < è una dimostrazione dal vivo del problema utilizzando la libreria per timore

La mia domanda è: perché? come posso essere privo di avvisi nel primo caso usando la macro? Non posso permettermi di mettere a tacere l'avvertimento a livello globale.

+0

So che questo non risponde alla domanda, ma '-Waggregate-return' sembra piuttosto pedante e dovrebbe essere ignorato, specialmente in C++ dove il ritorno di valore è perfettamente normale. Puoi dare un'occhiata a [questa domanda] (http://stackoverflow.com/questions/14016993/confusion-in-regards-to-purpose-behavior-of-waggregate-return). –

+1

Ricordo vagamente che GCC ha problemi con la pragma nelle macro; potresti voler cercare il loro bugzilla. –

+0

@AlexandreC. Non userei mai questo avvertimento per il codice personale, ma la biblioteca che sto scrivendo dovrebbe essere completamente priva di avvertimenti anche sui livelli più aggressivi (soffro di perfezionismo) ... Anche questo avvertimento non è in '' '-Wall' '' or '' '-Wextra''' per una buona ragione ... – onqtam

risposta

1

Questi bug aspetto rilevante:

quindi potrebbe avere a che fare con il confronto numero di riga, o qualche problema simile all'interno del parser, e potrebbe essere risolto in qualche futuro v ersion.

+0

wow che sembra abbastanza generale ... finora ho messo a tacere solo gli avvisi clang con '' '_Pragma''' e funziona bene lì ... strano che gcc non avrebbe funzionato correttamente per così tanto tempo – onqtam

+0

@onqtam funzionerà bene al di fuori di una macro, e in base alla prima replicazione del bug, anche in C. Gli errori di GCC vengono corretti in base all'interesse che qualcuno ha nel risolvere il problema bug; un po 'di pubblicità non fa male, ma ci sono molti bug non risolti più vecchi. I bug di avviso non sono di solito considerevoli, afaik. – rici

+0

@onqtam a proposito, devi parentesi con 'expr' in quella macro (dove è usata, non nel prototipo.) – rici

-2

Si potrebbe provare:

#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

non compileranno nemmeno – onqtam