From: Erich Keane Date: Wed, 25 Oct 2017 20:23:13 +0000 (+0000) Subject: Ignore implicity casts for zero-as-null-pointer-constant warning X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1c6ec39fd744fa88b373ec68d31a5ddb43cf932f;p=clang Ignore implicity casts for zero-as-null-pointer-constant warning The repro in https://bugs.llvm.org/show_bug.cgi?id=34362 caused the left nullptr to be cast to a int* implicitly, which resulted diagnosing this falsely. Differential Revision: https://reviews.llvm.org/D39301 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@316605 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 548f336c3b..a9d6cb4c58 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -438,7 +438,7 @@ void Sema::diagnoseNullableToNonnullConversion(QualType DstType, void Sema::diagnoseZeroToNullptrConversion(CastKind Kind, const Expr* E) { if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer) return; - if (E->getType()->isNullPtrType()) + if (E->IgnoreParenImpCasts()->getType()->isNullPtrType()) return; // nullptr only exists from C++11 on, so don't warn on its absence earlier. if (!getLangOpts().CPlusPlus11) diff --git a/test/SemaCXX/warn-zero-nullptr.cpp b/test/SemaCXX/warn-zero-nullptr.cpp index edd2a759b7..72280405d7 100644 --- a/test/SemaCXX/warn-zero-nullptr.cpp +++ b/test/SemaCXX/warn-zero-nullptr.cpp @@ -25,3 +25,10 @@ void g() { // Warn on these too. Matches gcc and arguably makes sense. void* pp = (decltype(nullptr))0; // expected-warning{{zero as null pointer constant}} void* pp2 = static_cast(0); // expected-warning{{zero as null pointer constant}} + +// Shouldn't warn. +namespace pr34362 { +struct A { operator int*() { return nullptr; } }; +void func() { if (nullptr == A()) {} } +void func2() { if ((nullptr) == A()) {} } +}