From f89e0bb2c4cb8a90c708b526bb0f14a5526d854f Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Mon, 8 May 2017 15:22:09 +0000 Subject: [PATCH] [clang-tidy] Fix readability-implicit-bool-cast false positives The patch makes the check treat binary conditional operator (`x ?: y`), `while` and regular `for` loops as conditional statements for the purpose of AllowConditional*Cast options. llvm-svn: 302431 --- .../clang-tidy/readability/ImplicitBoolCastCheck.cpp | 3 ++- .../readability-implicit-bool-cast-allow-conditional-casts.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolCastCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolCastCheck.cpp index 13b410b..20ce5d2 100644 --- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolCastCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolCastCheck.cpp @@ -227,7 +227,8 @@ bool isAllowedConditionalCast(const ImplicitCastExpr *Cast, const Stmt *S = N.get(); if (!S) return false; - if (isa(S) || isa(S)) + if (isa(S) || isa(S) || isa(S) || + isa(S) || isa(S)) return true; if (isa(S) || isa(S) || isUnaryLogicalNotOperator(S) || diff --git a/clang-tools-extra/test/clang-tidy/readability-implicit-bool-cast-allow-conditional-casts.cpp b/clang-tools-extra/test/clang-tidy/readability-implicit-bool-cast-allow-conditional-casts.cpp index 3268249..19c08ec 100644 --- a/clang-tools-extra/test/clang-tidy/readability-implicit-bool-cast-allow-conditional-casts.cpp +++ b/clang-tools-extra/test/clang-tidy/readability-implicit-bool-cast-allow-conditional-casts.cpp @@ -27,9 +27,17 @@ void implicitCastIntegerToBoolInConditionalsIsAllowed() { if (!functionReturningInt()) {} if (functionReturningInt() && functionReturningPointer()) {} if (!functionReturningInt() && !functionReturningPointer()) {} + for (; functionReturningInt(); ) {} + for (; functionReturningPointer(); ) {} + for (; functionReturningInt() && !functionReturningPointer() || (!functionReturningInt() && functionReturningPointer()); ) {} + while (functionReturningInt()) {} + while (functionReturningPointer()) {} + while (functionReturningInt() && !functionReturningPointer() || (!functionReturningInt() && functionReturningPointer())) {} int value1 = functionReturningInt() ? 1 : 2; int value2 = !functionReturningInt() ? 1 : 2; int value3 = (functionReturningInt() && functionReturningPointer() || !functionReturningInt()) ? 1 : 2; + int value4 = functionReturningInt() ?: value3; + int *p1 = functionReturningPointer() ?: &value3; } void regularImplicitCastPointerToBoolIsNotIgnored() { -- 2.7.4