From: Steve Naroff Date: Tue, 28 Aug 2007 21:20:34 +0000 (+0000) Subject: Teach Expr::isNullPointerConstant() about ImplicitCastExpr's. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7269f2d6cbe8c876aa5b007c35e4a3c3fed72cbd;p=clang 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 --- 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(this)) { + // Check that it is a cast to void*. + if (const PointerType *PT = dyn_cast(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(this)) { // Accept ((void*)0) as a null pointer constant, as many other // implementations do.