[clang-tools-extra] r347671 - [clang-tidy] Ignore bool -> single bit bitfield conversion in readability-implicit-bool-conversion

Malcolm Parsons via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 27 08:23:39 PST 2018


Author: malcolm.parsons
Date: Tue Nov 27 08:23:39 2018
New Revision: 347671

URL: http://llvm.org/viewvc/llvm-project?rev=347671&view=rev
Log:
[clang-tidy] Ignore bool -> single bit bitfield conversion in readability-implicit-bool-conversion

Summary: There is no ambiguity / information loss in this conversion

Reviewers: alexfh, aaron.ballman, hokein

Reviewed By: alexfh

Subscribers: xazax.hun, cfe-commits

Differential Revision: https://reviews.llvm.org/D54941

Modified:
    clang-tools-extra/trunk/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
    clang-tools-extra/trunk/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst
    clang-tools-extra/trunk/test/clang-tidy/readability-implicit-bool-conversion.cpp

Modified: clang-tools-extra/trunk/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/ImplicitBoolConversionCheck.cpp?rev=347671&r1=347670&r2=347671&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/readability/ImplicitBoolConversionCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/readability/ImplicitBoolConversionCheck.cpp Tue Nov 27 08:23:39 2018
@@ -306,6 +306,11 @@ void ImplicitBoolConversionCheck::regist
   auto boolOpAssignment =
       binaryOperator(anyOf(hasOperatorName("|="), hasOperatorName("&=")),
                      hasLHS(expr(hasType(booleanType()))));
+  auto bitfieldAssignment = binaryOperator(
+      hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
+  auto bitfieldConstruct = cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
+      withInitializer(equalsBoundNode("implicitCastFromBool")),
+      forField(hasBitWidth(1)))));
   Finder->addMatcher(
       implicitCastExpr(
           implicitCastFromBool,
@@ -313,14 +318,15 @@ void ImplicitBoolConversionCheck::regist
           // in such context:
           //   bool_expr_a == bool_expr_b
           //   bool_expr_a != bool_expr_b
-          unless(hasParent(binaryOperator(
-              anyOf(boolComparison, boolXor, boolOpAssignment)))),
+          unless(hasParent(binaryOperator(anyOf(
+              boolComparison, boolXor, boolOpAssignment, bitfieldAssignment)))),
+          implicitCastExpr().bind("implicitCastFromBool"),
+          unless(hasParent(bitfieldConstruct)),
           // Check also for nested casts, for example: bool -> int -> float.
           anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
                 anything()),
           unless(isInTemplateInstantiation()),
-          unless(hasAncestor(functionTemplateDecl())))
-          .bind("implicitCastFromBool"),
+          unless(hasAncestor(functionTemplateDecl()))),
       this);
 }
 

Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst?rev=347671&r1=347670&r2=347671&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst (original)
+++ clang-tools-extra/trunk/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst Tue Nov 27 08:23:39 2018
@@ -74,7 +74,8 @@ In general, the following conversion typ
 
 - pointer/pointer to member/``nullptr``/``NULL`` to boolean,
 
-- boolean expression/literal to integer,
+- boolean expression/literal to integer (conversion from boolean to a single
+  bit bitfield is explicitly allowed),
 
 - boolean expression/literal to floating.
 

Modified: clang-tools-extra/trunk/test/clang-tidy/readability-implicit-bool-conversion.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-implicit-bool-conversion.cpp?rev=347671&r1=347670&r2=347671&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/readability-implicit-bool-conversion.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/readability-implicit-bool-conversion.cpp Tue Nov 27 08:23:39 2018
@@ -444,14 +444,27 @@ struct S {
   int a;
   int b : 1;
   int c : 2;
+
+  S(bool a, bool b, bool c) : a(a), b(b), c(c) {}
+  // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion bool -> 'int'
+  // CHECK-MESSAGES: :[[@LINE-2]]:45: warning: implicit conversion bool -> 'int'
+  // CHECK-FIXES: S(bool a, bool b, bool c) : a(static_cast<int>(a)), b(b), c(static_cast<int>(c)) {}
 };
 
-bool f(const S& s) {
+bool f(S& s) {
   functionTaking<bool>(s.a);
   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int' -> bool
   // CHECK-FIXES: functionTaking<bool>(s.a != 0);
   functionTaking<bool>(s.b);
   // CHECK-FIXES: functionTaking<bool>(s.b);
+  s.a = true;
+  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: implicit conversion bool -> 'int'
+  // CHECK-FIXES: s.a = 1;
+  s.b = true;
+  // CHECK-FIXES: s.b = true;
+  s.c = true;
+  // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: implicit conversion bool -> 'int'
+  // CHECK-FIXES: s.c = 1;
   functionTaking<bool>(s.c);
   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int' -> bool
   // CHECK-FIXES: functionTaking<bool>(s.c != 0);




More information about the cfe-commits mailing list