From: Chandler Carruth Date: Sat, 9 Apr 2011 07:48:17 +0000 (+0000) Subject: Clean up the bool conversion warning. Group it with other conversion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b6006696358572a668d6de773af8f550e54259bf;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 1ef1224898..92d5dd9e61 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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>; +def warn_impcast_bool_to_null_pointer : Warning< + "initialization of pointer of type %0 to NULL from a constant boolean " + "expression">, InGroup; + 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; - def note_ovl_candidate_inherited_constructor : Note<"inherited from here">; def note_ovl_candidate_bad_deduction : Note< "candidate template ignored: failed template argument deduction">; diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 905b555381..ac2ba1a992 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -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()) if (const PointerType *ToPtrType = ToType->getAs()) { diff --git a/test/SemaCXX/warn_false_to_pointer.cpp b/test/SemaCXX/warn-bool-conversion.cpp similarity index 66% rename from test/SemaCXX/warn_false_to_pointer.cpp rename to test/SemaCXX/warn-bool-conversion.cpp index 20d4b3a52d..f6fa9f2836 100644 --- a/test/SemaCXX/warn_false_to_pointer.cpp +++ b/test/SemaCXX/warn-bool-conversion.cpp @@ -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*);