2013-02-26 8 views
5

Mi sono perso il motivo per cui Clang rifiuta il seguente codice:Clang rifiutare type_info come incompleto anche se <typeinfo> è incluso

#include <typeinfo> 
#include <exception> 

const char* get_name(const std::exception_ptr eptr) 
{ 
    return eptr.__cxa_exception_type()->name(); 
} 

int main() {} 

E 'OK con GCC, ma Clang lamenta type_info essere un tipo incompleto:

$ g++-4.7 -std=c++0x -O3 -Wall -Wextra t.cc -o t 
$ clang++-3.2 -std=c++0x -O3 -Wall -Wextra t.cc -o t 
t.cc:6:37: error: member access into incomplete type 'const class type_info' 
    return eptr.__cxa_exception_type()->name(); 
            ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/exception_ptr.h:144:19: note: forward declaration of 
     'std::__exception_ptr::type_info' 
     const class type_info* 
       ^
1 error generated. 
$ 

Domanda: Come posso risolvere il problema con Clang? O mi sto perdendo qualcosa e Clang ha ragione nel rifiutare il codice?

+2

Hai problema non con 'std :: type_info' ma con' std :: __ exception_ptr :: type_info', che sembra essere specifici per gcc. –

+3

Stai utilizzando funzioni non standard, cosa ti aspetti? – Pubby

+0

Non sto usando libC++, ma libstdC++ (come puoi vedere dal percorso nel messaggio di errore). E 'std :: __ exception_ptr :: type_info' è in realtà una dichiarazione avanzata creata in modo errato perché Clang non sembra raccogliere' std :: type_info' dato che puoi controllare l'intestazione del messaggio di errore. E non standard ... beh ... il mondo reale non è perfetto. Fa parte del codice base che sto trasmettendo a Clang. Speravo solo in aiuto costruttivo. –

risposta

4

Grazie al commento di @ HowardHinnant, sono riuscito a risolvere il problema. Il problema è diventato evidente nell'output del preprocessore: libstdC++ include <exception> da <type_info> prima ancora di dichiaratostd::type_info. Ciò ha fatto assumere a Clang una nuova dichiarazione anticipata std::__exception_ptr::type_info. La soluzione è semplice come è illegale:

namespace std { class type_info; } 

#include <typeinfo> 
#include <exception> 

const char* get_name(const std::exception_ptr eptr) 
{ 
    return eptr.__cxa_exception_type()->name(); 
} 

int main() {} 

Sembra come dovrei controllare se libstdC++ ha già un bug report per questo e, in caso contrario, crearne uno.

UPDATE: Bug #56468 è ora fissata per GCC 4.7.3+

+0

Ah, buon ol 'implicito 'type_info' in libstdC++. – Xeo

+0

@Xeo: Presumo dal tuo commento che g ++ presuppone che ci sia un tipo chiamato 'std :: type_info' senza una dichiarazione? Che risponde alla mia domanda "Perché questo lavoro g ++?". –

+0

GCC sembra implicitamente dichiarare 'std :: type_info'. Di solito si verifica questo problema la prima volta quando si esegue un tipico Hello World con Clang e libstdC++. – Xeo

Problemi correlati