Index: clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.h =================================================================== --- clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.h +++ clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.h @@ -22,10 +22,13 @@ /// http://clang.llvm.org/extra/clang-tidy/checks/hicpp-signed-bitwise.html class SignedBitwiseCheck : public ClangTidyCheck { public: - SignedBitwiseCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + SignedBitwiseCheck(StringRef Name, ClangTidyContext *Context); void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + void storeOptions(ClangTidyOptions::OptionMap &Options) override; + +private: + bool IgnorePositiveIntegerLiterals; }; } // namespace hicpp Index: clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.cpp +++ clang-tools-extra/clang-tidy/hicpp/SignedBitwiseCheck.cpp @@ -17,9 +17,24 @@ namespace tidy { namespace hicpp { +SignedBitwiseCheck::SignedBitwiseCheck(StringRef Name, + ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + IgnorePositiveIntegerLiterals( + Options.getLocalOrGlobal("IgnorePositiveIntegerLiterals", false)) {} + +void SignedBitwiseCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IgnorePositiveIntegerLiterals", + IgnorePositiveIntegerLiterals); +} + void SignedBitwiseCheck::registerMatchers(MatchFinder *Finder) { const auto SignedIntegerOperand = - expr(ignoringImpCasts(hasType(isSignedInteger()))).bind("signed-operand"); + (IgnorePositiveIntegerLiterals + ? expr(ignoringImpCasts(hasType(isSignedInteger())), + unless(integerLiteral())) + : expr(ignoringImpCasts(hasType(isSignedInteger())))) + .bind("signed-operand"); // The standard [bitmask.types] allows some integral types to be implemented // as signed types. Exclude these types from diagnosing for bitwise or(|) and Index: clang-tools-extra/test/clang-tidy/hicpp-signed-bitwise-integer-literals.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/hicpp-signed-bitwise-integer-literals.cpp @@ -0,0 +1,31 @@ +// RUN: %check_clang_tidy %s hicpp-signed-bitwise %t -- \ +// RUN: -config="{CheckOptions: [{key: hicpp-signed-bitwise.IgnorePositiveIntegerLiterals, value: 1 }]}" \ +// RUN: -- -std=c++11 + +void examples() { + unsigned UValue = 40u; + unsigned URes; + + URes = UValue & 1u; //Ok + URes = UValue & -1; + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use of a signed integer operand with a binary bitwise operator + + int IResult; + IResult = 10 & 2; //Ok + IResult = 3 << -1; + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator + + int Int = 30; + IResult = Int << 1; + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use of a signed integer operand with a binary bitwise operator + IResult = ~0; //Ok +} + +enum EnumConstruction { + one = 1, + two = 2, + test1 = 1 << 12, //Ok + test2 = one << two, + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use of a signed integer operand with a binary bitwise operator + test3 = 1u << 12, //Ok +};