From ffab873ed5f5094d459094e87480a3f01e892233 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sat, 9 Apr 2011 07:32:05 +0000 Subject: [PATCH] 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. llvm-svn: 129204 --- clang/lib/Sema/SemaOverload.cpp | 10 +++++----- clang/test/SemaCXX/warn_false_to_pointer.cpp | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 3212c36b9ab0..905b555381ae 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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/clang/test/SemaCXX/warn_false_to_pointer.cpp b/clang/test/SemaCXX/warn_false_to_pointer.cpp index 26b54f6e685b..20d4b3a52d46 100644 --- a/clang/test/SemaCXX/warn_false_to_pointer.cpp +++ b/clang/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*);