2010-08-20 3 views
12

나는 Clang.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] ~ $ 

컴파일하지만 g++와 동일한 코드를 컴파일 할 때 오류가 왔을 때 어떤 오류를 포기하지 않았다 Clang

class Prasoon{ 

    static const int dummy = 0; 

}; 
int const Prasoon::dummy = 0; 

int main(){} 

위의 코드를 아래의 코드를 컴파일하려고 예상대로

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

그래서 Clang에 버그를 발견 했습니까?

+0

사용중인 clang 버전은 무엇입니까? Mac의 1.5는 g ++ 4.2.1과 동일한 출력을 제공합니다. – Eiko

+1

샘플 출력 : clang 버전 2.8 (트렁크 107611) – Douglas

+2

글쎄, 편집하기 전에는 아니었다 .-) – Eiko

답변

9

예, 버그를 발견했습니다.

규칙은 표준에서 표현된다

9.4.2-3 : 정적 데이터 부재 CONST 문자 유형 인 경우 에서, 클래스 정의의 선언은 brace- 지정할 수이니셜 라이저 절이 할당 표현 인 모든 동등한 이니셜 라이저는 상수 표현식입니다. 리터럴 유형 의 정적 데이터 멤버는 클래스 정의에서 constexpr 지정자를 사용하여 선언 할 수 있습니다. 그렇다면 선언은 이니셜 라이저 절이 할당 표현 인 모든 보조자 ​​절이 표현 인 중괄호 또는 동등한 이니셜 라이저를 지정해야합니다. [참고 :이 두 사례의 경우 회원은 상수 표현에 나타날 수 있습니다. - 끝 노트] 구성원은 네임 스페이스 범위에서 계속 정의되어야하며이 항목이 프로그램에서 사용되고 이름 공간 범위 정의가 이니셜 라이저를 포함하지 않아야합니다.

4

예, 실제로 버그입니다. 나는 당신의 bug report을 우연히 만났습니다 - 제출할 시간을내어 주셔서 감사합니다 :)이 버그는 처음에 4/23/10에 bug으로 기록되었지만 귀하의 제출물이 제 관심을 불러 일으켰고 간단한 patch을 제출했습니다 그들의 검토를 위해 개발자 그룹.

관련 문제