Commit 4de6b158 authored by Vladimir Plyashkun's avatar Vladimir Plyashkun Committed by Aaron Ballman
Browse files

Add an option to hicpp-signed-bitwise for positive integer literals.

This gives developers a way to deviate from the coding standard to reduce the
chattiness of the check.
parent 0de262d7
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -17,9 +17,24 @@ namespace clang {
namespace tidy {
namespace hicpp {

SignedBitwiseCheck::SignedBitwiseCheck(StringRef Name,
                                       ClangTidyContext *Context)
    : ClangTidyCheck(Name, Context),
      IgnorePositiveIntegerLiterals(
          Options.get("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
+5 −2
Original line number Diff line number Diff line
@@ -22,10 +22,13 @@ namespace hicpp {
/// 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
+5 −0
Original line number Diff line number Diff line
@@ -103,6 +103,11 @@ Improvements to clang-tidy
  Finds uses of deprecated Googletest APIs with names containing ``case`` and
  replaces them with equivalent APIs with ``suite``.

- Improved :doc:`hicpp-signed-bitwise
  <clang-tidy/checks/hicpp-signed-bitwise>` check.

  The check now supports the ``IgnorePositiveIntegerLiterals`` option.

- New :doc:`linuxkernel-must-use-errs
  <clang-tidy/checks/linuxkernel-must-use-errs>` check.

+8 −0
Original line number Diff line number Diff line
@@ -7,3 +7,11 @@ Finds uses of bitwise operations on signed integer types, which may lead to
undefined or implementation defined behaviour.

The according rule is defined in the `High Integrity C++ Standard, Section 5.6.1 <http://www.codingstandard.com/section/5-6-shift-operators/>`_.

Options
-------

.. option:: IgnorePositiveIntegerLiterals

   If this option is set to `true`, the check will not warn on bitwise operations with positive integer literals, e.g. `~0`, `2 << 1`, etc.
   Default value is `false`.