2010-08-20 30 views
12

J'ai essayé de compiler le code ci-dessous avec ClangAi-je trouvé un bug dans Clang?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

Le code ci-dessus n'a donné aucune erreur lors de la compilation avec 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] ~ $ 

Mais quand je compilé le même code avec g++ Je suis une erreur comme prévu.

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

J'ai donc trouvé un bug dans Clang?

+0

Quelle version de clang utilisez-vous? 1.5 sur Mac donne la même sortie que g ++ 4.2.1. – Eiko

+1

C'est dans son exemple de sortie: clang version 2.8 (tronc 107611) – Douglas

+2

Eh bien, ce n'était pas avant l'édition ;-) – Eiko

Répondre

9

Oui, vous avez trouvé un bug.

La règle est exprimée dans la norme:

9.4.2-3: Si un membre de données statique est const de type littéral, sa déclaration dans la définition de la classe peut spécifier un brace- or- initialiseur égal dans lequel chaque clause d'initialisation qui est une expression d'affectation est une expression constante . Un membre de données statiques de type littéral peut être déclaré dans la définition de classe avec le spécificateur constexpr ; Si tel est le cas, sa déclaration doit spécifier un initialisateur dans lequel chaque clause d'initialisation qui est une expression d'affectation est une expression constante . [Remarque: Dans les deux cas , le membre peut apparaître dans les expressions constantes . - note de fin] Le membre doit toujours être défini dans une étendue d'espace de noms s'il est utilisé dans le programme et si la définition d'étendue d'espace de noms ne doit pas contenir d'initialiseur .

4

Oui, c'est effectivement un bug. Je suis tombé sur votre bug report pour clanger - merci d'avoir pris le temps de le soumettre :) Bien que ce bogue ait été initialement enregistré en tant que bug le 23/04/10, votre soumission l'a porté à mon attention et j'ai soumis un simple patch à le groupe du développeur pour leur examen.