From: Sebastian Redl Date: Sat, 7 Feb 2009 13:06:23 +0000 (+0000) Subject: Make const-initialized const integral variables I-C-Es in C++. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a4251b9e719415f30db0f5170abf31296a62225;p=clang Make const-initialized const integral variables I-C-Es in C++. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64015 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index d686167cd0..904fe5f99c 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -865,6 +865,17 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, Result = D->getInitVal(); break; } + if (Ctx.getLangOptions().CPlusPlus && + getType().getCVRQualifiers() == QualType::Const) { + // C++ 7.1.5.1p2 + // A variable of non-volatile const-qualified integral or enumeration + // type initialized by an ICE can be used in ICEs. + if (const VarDecl *Dcl = + dyn_cast(cast(this)->getDecl())) { + if (const Expr *Init = Dcl->getInit()) + return Init->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated); + } + } if (Loc) *Loc = getLocStart(); return false; case UnaryOperatorClass: { diff --git a/test/SemaCXX/i-c-e-cxx.cpp b/test/SemaCXX/i-c-e-cxx.cpp new file mode 100644 index 0000000000..64ffe8bce8 --- /dev/null +++ b/test/SemaCXX/i-c-e-cxx.cpp @@ -0,0 +1,6 @@ +// RUN: clang -fsyntax-only -verify %s + +// C++-specific tests for integral constant expressions. + +const int c = 10; +int ar[c]; diff --git a/www/cxx_status.html b/www/cxx_status.html index a5a0454ab8..95ce0e5c15 100644 --- a/www/cxx_status.html +++ b/www/cxx_status.html @@ -1013,9 +1013,9 @@ welcome!

      7.1.5.1 [dcl.type.cv] ✓ ✓ - + ✓ + - Const integral variables with ICE initializers are not ICEs.       7.1.5.2 [dcl.type.simple]