aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2007-08-28 21:20:34 +0000
committerSteve Naroff <snaroff@apple.com>2007-08-28 21:20:34 +0000
commit7269f2d6cbe8c876aa5b007c35e4a3c3fed72cbd (patch)
treea7ed1704233fd04408d8923c67a44c1a5e4345cd
parent5912a3544e438a92832b8c52c13f48d4f54795dc (diff)
Teach Expr::isNullPointerConstant() about ImplicitCastExpr's.
This fixes the following (recent) regression noticed by Keith Bauer (thanks!). void func(void *a); main() { void *p; p = 0; func(0); } ...which now works as you would expect. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41557 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--AST/Expr.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index cacfcfa0ca..69ea9442ff 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -647,6 +647,14 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx) const {
CE->getSubExpr()->getType()->isIntegerType()) // from int.
return CE->getSubExpr()->isNullPointerConstant(Ctx);
}
+ } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
+ // Check that it is a cast to void*.
+ if (const PointerType *PT = dyn_cast<PointerType>(ICE->getType())) {
+ QualType Pointee = PT->getPointeeType();
+ if (Pointee.getQualifiers() == 0 && Pointee->isVoidType() && // to void*
+ ICE->getSubExpr()->getType()->isIntegerType()) // from int.
+ return ICE->getSubExpr()->isNullPointerConstant(Ctx);
+ }
} else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
// Accept ((void*)0) as a null pointer constant, as many other
// implementations do.