2010-08-20 7 views
12

ho provato a compilare il codice qui sotto con ClangHo trovato un bug in Clang?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

Il codice di cui sopra non ha dato alcun errore quando si compila con Clang.

[email protected] ~ $ clang++ --version 
clang version 2.8 (trunk 107611) 
Target: i386-pc-linux-gnu 
Thread model: posix 
[email protected] ~ $ cat bug.cpp 
class Prasoon{ 

     private: 
     static const int dummy = 0; 

    }; 

int const Prasoon::dummy = 0; 

int main(){} 
[email protected] ~ $ clang++ bug.cpp 
[email protected] ~ $ 

Ma quando ho compilato lo stesso codice con g++ ho ottenuto un errore come previsto.

[email protected] ~ $ g++ bug.cpp 
bug.cpp:8: error: duplicate initialization of ‘Prasoon::dummy’ 

Così ho trovato un bug in Clang?

+0

Quale versione clang stai usando? 1.5 su Mac fornisce lo stesso risultato di g ++ 4.2.1. – Eiko

+1

Questo è nel suo esempio di output: clang versione 2.8 (baule 107611) – Douglas

+2

Bene, non era prima della modifica ;-) – Eiko

risposta

9

Sì, hai trovato un bug.

La regola è espresso in standard:

9.4.2-3: Se un membro di dati statico è di tipo const letterale , la sua dichiarazione nella definizione della classe possibile specificare un brace- or- equal-initializer in cui ogni clausola di inizializzazione che è un'espressione di assegnazione è un'espressione costante . Un membro di dati statici del tipo letterale può essere dichiarato nella definizione della classe con l'identificatore constexpr ; in tal caso, la sua dichiarazione deve specificare un iniziatore iniziatore o uguale in cui ogni clausola di inizializzazione che è un'espressione di assegnazione è un'espressione costante . [Nota: in entrambi i casi , il membro può apparire nelle espressioni costanti . - end note] Il membro deve ancora essere definito in uno scope dello spazio dei nomi se è utilizzato nel programma e nella definizione dello spazio dei nomi non deve contenere un inizializzatore .

4

Sì, questo è davvero un bug. Mi sono imbattuto nel tuo bug report a clang - grazie per averci dedicato del tempo per inviarlo :) Anche se inizialmente questo bug è stato registrato come bug su 4/23/10, il tuo invio lo ha portato alla mia attenzione e ho inviato un semplice patch a il gruppo dello sviluppatore per la sua recensione.