From e5f429d36167b418334fe0a4e4fac6dfcf173eaa Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 13 Aug 2025 12:55:34 +0200 Subject: [PATCH] checkcondition.cpp: fixed `-Wbitwise-instead-of-logical` Clang warnings these are shown with a make build using Clang --- cmake/compileroptions.cmake | 1 - lib/checkcondition.cpp | 17 ++++++++++++----- lib/checkcondition.h | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cmake/compileroptions.cmake b/cmake/compileroptions.cmake index be906e46afe..daf04a3d84a 100644 --- a/cmake/compileroptions.cmake +++ b/cmake/compileroptions.cmake @@ -120,7 +120,6 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options_safe(-Wno-switch-enum) add_compile_options_safe(-Wno-date-time) add_compile_options(-Wno-disabled-macro-expansion) - add_compile_options_safe(-Wno-bitwise-instead-of-logical) add_compile_options(-Wno-sign-compare) add_compile_options_safe(-Wno-ms-bitfield-padding) # TODO: fix this diff --git a/lib/checkcondition.cpp b/lib/checkcondition.cpp index 79ed28332c2..b5316dbee00 100644 --- a/lib/checkcondition.cpp +++ b/lib/checkcondition.cpp @@ -78,6 +78,13 @@ bool CheckCondition::diag(const Token* tok, bool insert) return true; } +bool CheckCondition::diag(const Token* tok1, const Token* tok2) +{ + const bool b1 = diag(tok1); + const bool b2 = diag(tok2); + return b1 && b2; +} + bool CheckCondition::isAliased(const std::set &vars) const { for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) { @@ -515,7 +522,7 @@ void CheckCondition::duplicateCondition() void CheckCondition::duplicateConditionError(const Token *tok1, const Token *tok2, ErrorPath errorPath) { - if (diag(tok1) & diag(tok2)) + if (diag(tok1, tok2)) return; errorPath.emplace_back(tok1, "First condition"); errorPath.emplace_back(tok2, "Second condition"); @@ -581,7 +588,7 @@ void CheckCondition::overlappingElseIfConditionError(const Token *tok, nonneg in void CheckCondition::oppositeElseIfConditionError(const Token *ifCond, const Token *elseIfCond, ErrorPath errorPath) { - if (diag(ifCond) & diag(elseIfCond)) + if (diag(ifCond, elseIfCond)) return; std::ostringstream errmsg; errmsg << "Expression is always true because 'else if' condition is opposite to previous condition at line " @@ -857,7 +864,7 @@ static std::string innerSmtString(const Token * tok) void CheckCondition::oppositeInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) { - if (diag(tok1) & diag(tok2)) + if (diag(tok1, tok2)) return; const std::string s1(tok1 ? tok1->expressionString() : "x"); const std::string s2(tok2 ? tok2->expressionString() : "!x"); @@ -872,7 +879,7 @@ void CheckCondition::oppositeInnerConditionError(const Token *tok1, const Token* void CheckCondition::identicalInnerConditionError(const Token *tok1, const Token* tok2, ErrorPath errorPath) { - if (diag(tok1) & diag(tok2)) + if (diag(tok1, tok2)) return; const std::string s1(tok1 ? tok1->expressionString() : "x"); const std::string s2(tok2 ? tok2->expressionString() : "x"); @@ -887,7 +894,7 @@ void CheckCondition::identicalInnerConditionError(const Token *tok1, const Token void CheckCondition::identicalConditionAfterEarlyExitError(const Token *cond1, const Token* cond2, ErrorPath errorPath) { - if (diag(cond1) & diag(cond2)) + if (diag(cond1, cond2)) return; const bool isReturnValue = cond2 && Token::simpleMatch(cond2->astParent(), "return"); diff --git a/lib/checkcondition.h b/lib/checkcondition.h index 496ac835065..dac3ba8d0de 100644 --- a/lib/checkcondition.h +++ b/lib/checkcondition.h @@ -115,6 +115,8 @@ class CPPCHECKLIB CheckCondition : public Check { // The conditions that have been diagnosed std::set mCondDiags; bool diag(const Token* tok, bool insert=true); + /** @brief Mark both token as diagnosed */ + bool diag(const Token* tok1, const Token* tok2); bool isAliased(const std::set &vars) const; bool isOverlappingCond(const Token * cond1, const Token * cond2, bool pure) const; void assignIfError(const Token *tok1, const Token *tok2, const std::string &condition, bool result);