2010-08-20 15 views
12

traté de compilar el código de abajo con Clang¿He encontrado un error en Clang?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

El código anterior no dio ningún error cuando se 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] ~ $ 

Pero cuando compilé el mismo código con g++ me dio un error como se esperaba.

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

así he encontrado un fallo en Clang?

+0

¿Qué versión sonido metálico está usando? 1.5 en Mac da el mismo resultado que g ++ 4.2.1. – Eiko

+1

Eso está en su salida de muestra: clang versión 2.8 (tronco 107611) – Douglas

+2

Bueno, no fue antes de la edición ;-) – Eiko

Respuesta

9

Sí, se ha encontrado un error.

La regla se expresa en la norma:

9.4.2-3: Si un miembro de datos estáticos const es tipo literal, su declaración en la definición de clase puede especificar un brace- o- igual-inicializador en el que cada inicializador-cláusula que es una asignación-expresión es una constante expresión. Un miembro de datos estáticos de tipo literal puede ser declarada en la definición clase con el constexpr especificador; si es así, su declaración especificará un llave-o-inicializador en el que cada cláusula-inicializador que es una expresión-asignación es una expresión constante . [Nota: En ambos casos estos , el miembro puede aparecer en expresiones constantes. - nota final] El miembro aún se definirá en un ámbito de espacio de nombres si se utiliza en el programa y la definición del alcance del espacio de nombres no contendrá un inicializador .

4

Sí, esto es de hecho un error. Me encontré con su bug report para clang - gracias por tomarse el tiempo para enviarlo :) Si bien este error se registró inicialmente como bug en 23/04/10, su presentación me llamó la atención y he enviado un simple patch a el grupo de desarrolladores para su revisión.

Cuestiones relacionadas