2010-08-20 6 views
12

Ich habe versucht, den Code unten mit ClangHabe ich einen Fehler in Clang gefunden?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

Der obige Code einen Fehler nicht geben, zu kompilieren, wenn sie mit 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] ~ $ 

zusammengestellt Aber wenn ich den gleichen Code mit g++ zusammengestellt bekam ich einen Fehler wie erwartet.

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

Also habe ich einen Fehler in Clang gefunden?

+0

Welche Klangversion verwenden Sie? 1.5 auf Mac gibt die gleiche Ausgabe wie g ++ 4.2.1. – Eiko

+1

Das ist in seiner Beispielausgabe: clang Version 2.8 (trunk 107611) – Douglas

+2

Nun, es war nicht vor der Bearbeitung ;-) – Eiko

Antwort

9

Ja, Sie haben einen Fehler gefunden.

Die Regel in dem Standard ausgedrückt:

9.4.2-3: Wenn ein statisches Datenelement von const wörtlicher Art ist, ihre Erklärung in der Klassendefinition kann angeben, ein brace- or- equal-initializer, wobei jede Initialisierungsklausel, die ein Zuweisungsausdruck ist, eine konstante Formel ist. Ein statisches Datenelement des Literaltyps kann in der Klassendefinition mit dem Parameter consExpr deklariert werden; wenn ja, muss seine Deklaration einen Klammer-oder-Gleich-Initialisierer angeben, in dem jede Initialisierungsklausel, die ein Zuweisungsausdruck ist, ein konstanter Ausdruck ist. [Hinweis: In beiden Fällen kann das Element in Konstantenausdrücken erscheinen. - Endnote] Das Mitglied soll noch in einem Namespacebereich definiert werden, wenn es in dem Programm verwendet wird und die Namespace Umfang Definition stellt keinen initializer enthalten.

4

Ja, das ist in der Tat ein Fehler. Ich stolperte über Ihre bug report zu klingeln - Danke, dass Sie sich die Zeit genommen haben, es einzureichen :) Während dieser Bug am 23.04.10 zunächst als bug geloggt wurde, brachte mich Ihre Einreichung auf mich aufmerksam und ich habe eine einfache patch eingereicht die Entwicklergruppe für ihre Überprüfung.