Per discussion, remove the explicit restriction on static const data members with

out-of-line initializers as integer constant expressions.  Fixes PR6206.

llvm-svn: 95463
This commit is contained in:
John McCall 2010-02-06 01:07:37 +00:00
parent 6efc8e5120
commit 52cc0897f3
2 changed files with 19 additions and 10 deletions

View File

@ -1665,16 +1665,9 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
}
// C++ [class.static.data]p4:
// If a static data member is of const integral or const
// enumeration type, its declaration in the class definition can
// specify a constant-initializer which shall be an integral
// constant expression (5.19). In that case, the member can appear
// in integral constant expressions.
if (ID->isOutOfLine()) {
Dcl->setInitKnownICE(false);
return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());
}
// It's an ICE whether or not the definition we found is
// out-of-line. See DR 721 and the discussion in Clang PR
// 6206 for details.
if (Dcl->isCheckingICE()) {
return ICEDiag(2, cast<DeclRefExpr>(E)->getLocation());

View File

@ -21,3 +21,19 @@ int a() {
case t:; // expected-error {{not an integer constant expression}}
}
}
// PR6206: out-of-line definitions are legit
namespace pr6206 {
class Foo {
public:
static const int kBar;
};
const int Foo::kBar = 20;
char Test() {
char str[Foo::kBar];
str[0] = '0';
return str[0];
}
}