From: John McCall Date: Sat, 6 Feb 2010 01:07:37 +0000 (+0000) Subject: Per discussion, remove the explicit restriction on static const data members with X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1f1b3b3bdec84e2204f18732e3241f6907a17309;p=clang Per discussion, remove the explicit restriction on static const data members with out-of-line initializers as integer constant expressions. Fixes PR6206. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95463 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 50ddc9156a..4e6cdcab00 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1665,16 +1665,9 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { return ICEDiag(2, cast(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(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(E)->getLocation()); diff --git a/test/SemaCXX/i-c-e-cxx.cpp b/test/SemaCXX/i-c-e-cxx.cpp index 8c70bc2587..4f2f197467 100644 --- a/test/SemaCXX/i-c-e-cxx.cpp +++ b/test/SemaCXX/i-c-e-cxx.cpp @@ -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]; + } +}