forked from OSchip/llvm-project
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:
parent
6efc8e5120
commit
52cc0897f3
|
@ -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());
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue