2010-08-20 75 views
12

我试图在与Clang.我在Clang发现了一个bug吗?

[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

你正在使用哪个铿锵版本? Mac上的1.5给出与g ++ 4.2.1相同的输出。 – Eiko 2010-08-20 13:38:01

+1

这是在他的示例输出:铿锵2.8版(主干107611) – Douglas 2010-08-20 13:45:22

+2

那么,它不是在编辑之前;-) – Eiko 2010-08-20 14:08:11

回答

9

是的,你发现了一个错误。

该规则表示在标准:

9.4.2-3: 如果静态数据成员是常量 文本类型的,其在 类定义声明可以指定一个 brace-或 - 等初始值设定项,其中 每个初始值子句是 赋值表达式是常量 表达式。 文字类型的静态数据成员可以在带有constexpr 说明符的 类定义中声明;如果是,其声明 应指定一个 括号或等号初始值设定项,其中 每个初始值子句是 赋值表达式是常量 表达式。 [注意:在这两个 的情况下,该成员可能会出现在 常量表达式中。 - 结束注释] 如果在 程序中使用 成员,并且名称空间范围 定义中不包含 初始化程序,则该成员仍应在 命名空间范围内定义。

4

是的,这确实是一个错误。我偶然发现您的bug report叮当声 - 感谢您花时间提交它:)虽然此错误最初在4/23/10上记录为bug,但您提交的内容引起了我的注意,我已将简单的patch开发人员的小组进行审查。

相关问题