From 278c8d33e2d7cb8c4d102aa20002ccdde2c14155 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Fri, 31 Jan 2014 07:51:32 +0000 Subject: [PATCH] [Sema] For -Wnon-literal-null-conversion warning, look through integer casts, which are used by some projects in their null macro. rdar://15925483 llvm-svn: 200521 --- clang/lib/Sema/SemaOverload.cpp | 16 +++++++++++++++- clang/test/Sema/warn-null.c | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 8e52e620a775..9d70d9f3e48f 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -2622,6 +2622,19 @@ bool Sema::FunctionParamTypesAreEqual(const FunctionProtoType *OldType, return true; } +static Expr *ignoreIntegerCasts(Expr *E) { + while (true) { + if (ExplicitCastExpr *ECE = dyn_cast(E)) { + if (ECE->getType()->isIntegerType()) { + E = ECE->getSubExpr(); + continue; + } + } + + return E; + } +} + /// CheckPointerConversion - Check the pointer conversion from the /// expression From to the type ToType. This routine checks for /// ambiguous or inaccessible derived-to-base pointer @@ -2638,7 +2651,8 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType, Kind = CK_BitCast; if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() && - From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) == + ignoreIntegerCasts(From)-> + isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) == Expr::NPCK_ZeroExpression) { if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy)) DiagRuntimeBehavior(From->getExprLoc(), From, diff --git a/clang/test/Sema/warn-null.c b/clang/test/Sema/warn-null.c index 28fb6a5f691c..28ec631415dd 100644 --- a/clang/test/Sema/warn-null.c +++ b/clang/test/Sema/warn-null.c @@ -1,5 +1,7 @@ // RUN: %clang_cc1 %s -verify +#define NLL (unsigned long long)0 + // PR10837: Warn if a non-pointer-typed expression is folded to a null pointer int *p = 0; int *q = '\0'; // expected-warning{{expression which evaluates to zero treated as a null pointer constant}} @@ -8,4 +10,5 @@ void f() { p = 0; q = '\0'; // expected-warning{{expression which evaluates to zero treated as a null pointer constant}} r = 1 - 1; // expected-warning{{expression which evaluates to zero treated as a null pointer constant}} + p = NLL; }