diff options
| author | Malcolm Parsons <malcolm.parsons@gmail.com> | 2018-11-27 16:23:39 +0000 |
|---|---|---|
| committer | Malcolm Parsons <malcolm.parsons@gmail.com> | 2018-11-27 16:23:39 +0000 |
| commit | d8851b5def462d88924ba53cffe95a149f02d2e8 (patch) | |
| tree | 7d41a5590b20b081b57642c2020a77fa7dc7aaf5 /clang-tools-extra/clang-tidy | |
| parent | 14f3e3aa367301608941e3ac4a4b808d8d4f312c (diff) | |
| download | bcm5719-llvm-d8851b5def462d88924ba53cffe95a149f02d2e8.tar.gz bcm5719-llvm-d8851b5def462d88924ba53cffe95a149f02d2e8.zip | |
[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
llvm-svn: 347671
Diffstat (limited to 'clang-tools-extra/clang-tidy')
| -rw-r--r-- | clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp index 1cf1d03e825..b8ae224be59 100644 --- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp @@ -306,6 +306,11 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) { 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::registerMatchers(MatchFinder *Finder) { // 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); } |

