2010-08-20 13 views
12

Próbowałem skompilować kod poniżej z ClangCzy znalazłem błąd w Clang?

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

Powyższy kod nie daje żadnego błędu, gdy skompilowany z 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] ~ $ 

Ale kiedy skompilowane ten sam kod z g++ mam błąd zgodnie z oczekiwaniami.

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

Więc znalazłem błąd w Clang?

+0

Którą wersję klang używasz? 1.5 na Macu daje taką samą wydajność jak g ++ 4.2.1. – Eiko

+1

To jest w jego wynikach próbki: wersja klang 2.8 (trunk 107611) – Douglas

+2

Cóż, to nie było przed edycją ;-) – Eiko

Odpowiedz

9

Tak, znalazłeś błąd.

Zasada wyrażona jest w normie:

9.4.2-3: Jeśli statyczny element danych jest const typu dosłownym, jego oświadczenie w definicji klasy można określić brace- lub - inicjator równorzędny, w którym każda inicjująca klauzula, która jest wyrażeniem przypisania , jest stałą ekspresją . Statyczny element danych o typie literowym można zadeklarować w definicji klasy ze specyfikatorem constexpr ; jeżeli tak, jego deklaracja powinna określać inicjator ortokrotyczny lub równy, w którym każda inicjująca klauzula, która jest ekspresją przypisania , jest stałą ekspresją . [Uwaga: W obu przypadkach element może pojawić się w stałych wyrażeniach . - uwaga końcowa] Element będzie nadal zdefiniowany w zakresie przestrzeni nazw , jeśli jest używany w programie , a definicja obszaru nazw nie zawiera inicjalizatora .

4

Tak, to jest rzeczywiście błąd. Natknąłem się na twoje bug report, aby zadzwonić - dziękuję za poświęcenie czasu na przesłanie go :) Podczas gdy ten błąd był początkowo rejestrowany jako bug w dniu 4/23/10, twoje zgłoszenie zwróciło moją uwagę i przesłałem prostą patch do grupę programistów do sprawdzenia.

Powiązane problemy