From: Argyrios Kyrtzidis Date: Mon, 23 Jan 2012 20:38:53 +0000 (+0000) Subject: Introduce Sema::isNullExpr() that contains the checks that X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4f1813e55a13a19d4981d245d1da583c1051305b;p=clang Introduce Sema::isNullExpr() that contains the checks that Sema::DiagnoseSentinelCalls() does. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148722 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 2055f3bf6a..754b2906b3 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1375,6 +1375,7 @@ public: QualType &ConvertedType); bool IsBlockPointerConversion(QualType FromType, QualType ToType, QualType& ConvertedType); + bool isNullExpr(const Expr *E) const; bool FunctionArgTypesAreEqual(const FunctionProtoType *OldType, const FunctionProtoType *NewType, unsigned *ArgPos = 0); diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 9649666250..8d263b3b66 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -249,17 +249,7 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc, Expr *sentinelExpr = args[numArgs - numArgsAfterSentinel - 1]; if (!sentinelExpr) return; if (sentinelExpr->isValueDependent()) return; - - // nullptr_t is always treated as null. - if (sentinelExpr->getType()->isNullPtrType()) return; - - if (sentinelExpr->getType()->isAnyPointerType() && - sentinelExpr->IgnoreParenCasts()->isNullPointerConstant(Context, - Expr::NPC_ValueDependentIsNull)) - return; - - // Unfortunately, __null has type 'int'. - if (isa(sentinelExpr)) return; + if (isNullExpr(sentinelExpr)) return; // Pick a reasonable string to insert. Optimistically use 'nil' or // 'NULL' if those are actually defined in the context. Only use @@ -289,6 +279,24 @@ SourceRange Sema::getExprRange(Expr *E) const { return E ? E->getSourceRange() : SourceRange(); } +bool Sema::isNullExpr(const Expr *E) const { + if (!E) + return false; + + // nullptr_t is always treated as null. + if (E->getType()->isNullPtrType()) return true; + + if (E->getType()->isAnyPointerType() && + E->IgnoreParenCasts()->isNullPointerConstant(Context, + Expr::NPC_ValueDependentIsNull)) + return true; + + // Unfortunately, __null has type 'int'. + if (isa(E)) return true; + + return false; +} + //===----------------------------------------------------------------------===// // Standard Promotions and Conversions //===----------------------------------------------------------------------===//