[clang-tidy] Ignore singe bit bitfield -> bool conversion in readability-implicit-bool-conversion
llvm-svn: 343578
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index e88c143..1cf1d03 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -266,6 +266,7 @@
auto exceptionCases =
expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
+ has(ignoringImplicit(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1)))))),
hasParent(explicitCastExpr())));
auto implicitCastFromBool = implicitCastExpr(
anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst
index 64f3f73..a093680 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability-implicit-bool-conversion.rst
@@ -66,7 +66,9 @@
In general, the following conversion types are checked:
-- integer expression/literal to boolean,
+- integer expression/literal to boolean (conversion from a single bit bitfield
+ to boolean is explicitly allowed, since there's no ambiguity / information
+ loss in this case),
- floating expression/literal to boolean,
diff --git a/clang-tools-extra/test/clang-tidy/readability-implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/readability-implicit-bool-conversion.cpp
index 0bdd670..1cc0f4f 100644
--- a/clang-tools-extra/test/clang-tidy/readability-implicit-bool-conversion.cpp
+++ b/clang-tools-extra/test/clang-tidy/readability-implicit-bool-conversion.cpp
@@ -437,3 +437,24 @@
}
} // namespace ignoreUserDefinedConversionOperator
+
+namespace ignore_1bit_bitfields {
+
+struct S {
+ int a;
+ int b : 1;
+ int c : 2;
+};
+
+bool f(const 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);
+ functionTaking<bool>(s.c);
+ // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'int' -> bool
+ // CHECK-FIXES: functionTaking<bool>(s.c != 0);
+}
+
+} // namespace ignore_1bit_bitfields