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
This commit is contained in:
Chandler Carruth 2011-04-09 07:32:05 +00:00
parent 88974f4625
commit ffab873ed5
2 changed files with 13 additions and 6 deletions

View File

@ -1982,11 +1982,11 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
Kind = CK_BitCast;
if (CXXBoolLiteralExpr* LitBool
= dyn_cast<CXXBoolLiteralExpr>(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<PointerType>())
if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) {

View File

@ -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*);