From: Chandler Carruth Date: Sat, 9 Apr 2011 07:32:05 +0000 (+0000) Subject: Add support for warning on general null pointer expressions of boolean X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88f0aed95d2a0faf3cad66af2dc54596495a7d41;p=clang Add support for warning on general null pointer expressions of boolean type rather than just the literal 'false'. This begins fixing PR9612, but the message is now wrong. WIP, the cleanup of the messaging is next. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129204 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 3212c36b9a..905b555381 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1982,11 +1982,11 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType, Kind = CK_BitCast; - if (CXXBoolLiteralExpr* LitBool - = dyn_cast(From->IgnoreParens())) - if (!IsCStyleOrFunctionalCast && LitBool->getValue() == false) - DiagRuntimeBehavior(LitBool->getExprLoc(), From, - PDiag(diag::warn_init_pointer_from_false) << ToType); + if (!IsCStyleOrFunctionalCast && + Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy) && + From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull)) + DiagRuntimeBehavior(From->getExprLoc(), From, + PDiag(diag::warn_init_pointer_from_false) << ToType); if (const PointerType *FromPtrType = FromType->getAs()) if (const PointerType *ToPtrType = ToType->getAs()) { diff --git a/test/SemaCXX/warn_false_to_pointer.cpp b/test/SemaCXX/warn_false_to_pointer.cpp index 26b54f6e68..20d4b3a52d 100644 --- a/test/SemaCXX/warn_false_to_pointer.cpp +++ b/test/SemaCXX/warn_false_to_pointer.cpp @@ -5,7 +5,14 @@ int* j = false; // expected-warning{{ initialization of pointer of type 'int *' void foo(int* i, int *j=(false)) // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}} { foo(false); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}} - foo((int*)false); + foo((int*)false); // no-warning: explicit cast + foo(0); // no-warning: not a bool, even though its convertible to bool + + foo(false == true); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}} + foo((42 + 24) < 32); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}} + + const bool kFlag = false; + foo(kFlag); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}} } char f(struct Undefined*);