diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-14 21:38:30 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-14 21:38:30 +0000 |
commit | 70488e201ccd94d4bb1ef0868cc13cca2b7d4ff6 (patch) | |
tree | ba334a4211ad43de9a739a2e5e3f236e3004b083 /lib/AST/Expr.cpp | |
parent | a91ac5bae3944e0eed9ef25294dfb2b8681b8159 (diff) |
Pending clear answer from WG21 on whether core issue 903 is intended to apply to
C++11 or just C++17, restrict the set of null pointer constants in C++11 mode
back to those which were considered null in C++98.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150510 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Expr.cpp')
-rw-r--r-- | lib/AST/Expr.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 5d22d144f4..5b511cc883 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -2728,11 +2728,18 @@ Expr::isNullPointerConstant(ASTContext &Ctx, return NPCK_NotNull; // If we have an integer constant expression, we need to *evaluate* it and - // test for the value 0. - llvm::APSInt Result; - bool IsNull = isIntegerConstantExpr(Result, Ctx) && Result == 0; + // test for the value 0. Don't use the C++11 constant expression semantics + // for this, for now; once the dust settles on core issue 903, we might only + // allow a literal 0 here in C++11 mode. + if (Ctx.getLangOptions().CPlusPlus0x) { + if (!isCXX98IntegralConstantExpr(Ctx)) + return NPCK_NotNull; + } else { + if (!isIntegerConstantExpr(Ctx)) + return NPCK_NotNull; + } - return (IsNull ? NPCK_ZeroInteger : NPCK_NotNull); + return (EvaluateKnownConstInt(Ctx) == 0) ? NPCK_ZeroInteger : NPCK_NotNull; } /// \brief If this expression is an l-value for an Objective C |