mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Clean up the bool conversion warning. Group it with other conversion
warnings, and make its text appropriate for constant bool expressions other than 'false'. This should finish off PR9612. llvm-svn: 129205
This commit is contained in:
@@ -1197,6 +1197,10 @@ def warn_impcast_literal_float_to_integer : Warning<
|
||||
def warn_impcast_different_enum_types : Warning<
|
||||
"implicit conversion from enumeration type %0 to different enumeration type "
|
||||
"%1">, InGroup<DiagGroup<"conversion">>;
|
||||
def warn_impcast_bool_to_null_pointer : Warning<
|
||||
"initialization of pointer of type %0 to NULL from a constant boolean "
|
||||
"expression">, InGroup<BoolConversions>;
|
||||
|
||||
|
||||
def warn_cast_align : Warning<
|
||||
"cast from %0 to %1 increases required alignment from %2 to %3">,
|
||||
@@ -1367,10 +1371,6 @@ def note_ovl_candidate : Note<"candidate "
|
||||
"is the implicit copy assignment operator|"
|
||||
"is an inherited constructor}0%1">;
|
||||
|
||||
def warn_init_pointer_from_false : Warning<
|
||||
"initialization of pointer of type %0 from literal 'false'">,
|
||||
InGroup<BoolConversions>;
|
||||
|
||||
def note_ovl_candidate_inherited_constructor : Note<"inherited from here">;
|
||||
def note_ovl_candidate_bad_deduction : Note<
|
||||
"candidate template ignored: failed template argument deduction">;
|
||||
|
||||
@@ -1986,7 +1986,8 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
|
||||
Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy) &&
|
||||
From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull))
|
||||
DiagRuntimeBehavior(From->getExprLoc(), From,
|
||||
PDiag(diag::warn_init_pointer_from_false) << ToType);
|
||||
PDiag(diag::warn_impcast_bool_to_null_pointer)
|
||||
<< ToType << From->getSourceRange());
|
||||
|
||||
if (const PointerType *FromPtrType = FromType->getAs<PointerType>())
|
||||
if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) {
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
int* j = false; // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}}
|
||||
int* j = false; // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
|
||||
void foo(int* i, int *j=(false)) // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}}
|
||||
void foo(int* i, int *j=(false)) // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
{
|
||||
foo(false); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}}
|
||||
foo(false); // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
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'}}
|
||||
foo(false == true); // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
foo((42 + 24) < 32); // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
|
||||
const bool kFlag = false;
|
||||
foo(kFlag); // expected-warning{{ initialization of pointer of type 'int *' from literal 'false'}}
|
||||
foo(kFlag); // expected-warning{{ initialization of pointer of type 'int *' to NULL from a constant boolean expression}}
|
||||
}
|
||||
|
||||
char f(struct Undefined*);
|
||||
Reference in New Issue
Block a user