From: David Blaikie Date: Tue, 19 Jun 2012 21:19:06 +0000 (+0000) Subject: Enable -Wnull-conversion for non-integral target types (eg: double). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b26331b4ff419b22861b0823daf83bc8f22a6803;p=clang Enable -Wnull-conversion for non-integral target types (eg: double). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158744 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 41ac77b43b..fff8d80a47 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -4279,11 +4279,10 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T, return; } - if (!Source->isIntegerType() || !Target->isIntegerType()) - return; - if ((E->isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull) - == Expr::NPCK_GNUNull) && Target->isIntegerType()) { + == Expr::NPCK_GNUNull) && !Target->isAnyPointerType() + && !Target->isBlockPointerType() && !Target->isFunctionPointerType() + && !Target->isMemberFunctionPointerType()) { SourceLocation Loc = E->getSourceRange().getBegin(); if (Loc.isMacroID()) Loc = S.SourceMgr.getImmediateExpansionRange(Loc).first; @@ -4291,9 +4290,11 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T, S.Diag(Loc, diag::warn_impcast_null_pointer_to_integer) << T << clang::SourceRange(CC) << FixItHint::CreateReplacement(Loc, S.getFixItZeroLiteralForType(T)); - return; } + if (!Source->isIntegerType() || !Target->isIntegerType()) + return; + // TODO: remove this early return once the false positives for constant->bool // in templates, macros, etc, are reduced or removed. if (Target->isSpecificBuiltinType(BuiltinType::Bool)) diff --git a/test/FixIt/fixit.cpp b/test/FixIt/fixit.cpp index 68ede1e43b..3eac434a36 100644 --- a/test/FixIt/fixit.cpp +++ b/test/FixIt/fixit.cpp @@ -219,6 +219,7 @@ void Foo::SetBar(Bar bar) { bar_ = bar; } // expected-error {{must use 'enum' ta #define NULL __null char c = NULL; // expected-warning {{implicit conversion of NULL constant to 'char'}} +double dbl = NULL; // expected-warning {{implicit conversion of NULL constant to 'double'}} namespace arrow_suggest { diff --git a/test/SemaCXX/conversion.cpp b/test/SemaCXX/conversion.cpp index a9efd8c149..ad6e321dd3 100644 --- a/test/SemaCXX/conversion.cpp +++ b/test/SemaCXX/conversion.cpp @@ -69,6 +69,7 @@ void test3() { char ch = NULL; // expected-warning {{implicit conversion of NULL constant to 'char'}} unsigned char uch = NULL; // expected-warning {{implicit conversion of NULL constant to 'unsigned char'}} short sh = NULL; // expected-warning {{implicit conversion of NULL constant to 'short'}} + double dbl = NULL; // expected-warning {{implicit conversion of NULL constant to 'double'}} // Use FileCheck to ensure we don't get any unnecessary macro-expansion notes // (that don't appear as 'real' notes & can't be seen/tested by -verify)