diff options
3 files changed, 76 insertions, 7 deletions
diff --git a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp index 05c94d57dfd..2d24510eff2 100644 --- a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp +++ b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.cpp @@ -21,6 +21,18 @@ namespace runtime { using namespace ast_matchers; +IntegerTypesCheck::IntegerTypesCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + UnsignedTypePrefix(Options.get("UnsignedTypePrefix", "uint")), + SignedTypePrefix(Options.get("SignedTypePrefix", "int")), + TypeSuffix(Options.get("TypeSuffix", "")) {} + +void IntegerTypesCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "UnsignedTypePrefix", UnsignedTypePrefix); + Options.store(Opts, "SignedTypePrefix", SignedTypePrefix); + Options.store(Opts, "TypeSuffix", TypeSuffix); +} + void IntegerTypesCheck::registerMatchers(MatchFinder *Finder) { // Find all TypeLocs. The relevant Style Guide rule only applies to C++. if (getLangOpts().CPlusPlus) @@ -86,7 +98,8 @@ void IntegerTypesCheck::check(const MatchFinder::MatchResult &Result) { std::string Replacement = ((IsSigned ? SignedTypePrefix : UnsignedTypePrefix) + Twine(Width) + - (AddUnderscoreT ? "_t" : "")).str(); + TypeSuffix) + .str(); // We don't add a fix-it as changing the type can easily break code, // e.g. when a function requires a 'long' argument on all platforms. diff --git a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.h b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.h index ce8c2c3d55a..c7193c0e9c3 100644 --- a/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.h +++ b/clang-tools-extra/clang-tidy/google/IntegerTypesCheck.h @@ -23,16 +23,15 @@ namespace runtime { /// Correspondig cpplint.py check: 'runtime/int'. class IntegerTypesCheck : public ClangTidyCheck { public: - IntegerTypesCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context), UnsignedTypePrefix("uint"), - SignedTypePrefix("int"), AddUnderscoreT(false) {} + IntegerTypesCheck(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: - const StringRef UnsignedTypePrefix; - const StringRef SignedTypePrefix; - const bool AddUnderscoreT; + const std::string UnsignedTypePrefix; + const std::string SignedTypePrefix; + const std::string TypeSuffix; }; } // namespace runtime diff --git a/clang-tools-extra/test/clang-tidy/google-runtime-int-std.cpp b/clang-tools-extra/test/clang-tidy/google-runtime-int-std.cpp new file mode 100644 index 00000000000..8efd504672d --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/google-runtime-int-std.cpp @@ -0,0 +1,57 @@ +// RUN: %python %S/check_clang_tidy.py %s google-runtime-int %t \ +// RUN: -config='{CheckOptions: [ \ +// RUN: {key: google-runtime-int.UnsignedTypePrefix, value: "std::uint"}, \ +// RUN: {key: google-runtime-int.SignedTypePrefix, value: "std::int"}, \ +// RUN: {key: google-runtime-int.TypeSuffix, value: "_t"}, \ +// RUN: ]}' -- -std=c++11 + +long a(); +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: consider replacing 'long' with 'std::int{{..}}_t' + +typedef unsigned long long uint64; // NOLINT + +long b(long = 1); +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: consider replacing 'long' with 'std::int{{..}}_t' +// CHECK-MESSAGES: [[@LINE-2]]:8: warning: consider replacing 'long' with 'std::int{{..}}_t' + +template <typename T> +void tmpl() { + T i; +} + +short bar(const short, unsigned short) { +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: consider replacing 'short' with 'std::int16_t' +// CHECK-MESSAGES: [[@LINE-2]]:17: warning: consider replacing 'short' with 'std::int16_t' +// CHECK-MESSAGES: [[@LINE-3]]:24: warning: consider replacing 'unsigned short' with 'std::uint16_t' + long double foo = 42; + uint64 qux = 42; + unsigned short port; + + const unsigned short bar = 0; +// CHECK-MESSAGES: [[@LINE-1]]:9: warning: consider replacing 'unsigned short' with 'std::uint16_t' + long long *baar; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'long long' with 'std::int64_t' + const unsigned short &bara = bar; +// CHECK-MESSAGES: [[@LINE-1]]:9: warning: consider replacing 'unsigned short' with 'std::uint16_t' + long const long moo = 1; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'long long' with 'std::int64_t' + long volatile long wat = 42; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'long long' with 'std::int64_t' + unsigned long y; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'unsigned long' with 'std::uint{{..}}_t' + unsigned long long **const *tmp; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'unsigned long long' with 'std::uint64_t' + unsigned long long **const *&z = tmp; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'unsigned long long' with 'std::uint64_t' + unsigned short porthole; +// CHECK-MESSAGES: [[@LINE-1]]:3: warning: consider replacing 'unsigned short' with 'std::uint16_t' + + uint64 cast = (short)42; +// CHECK-MESSAGES: [[@LINE-1]]:18: warning: consider replacing 'short' with 'std::int16_t' + +#define l long + l x; + + tmpl<short>(); +// CHECK-MESSAGES: [[@LINE-1]]:8: warning: consider replacing 'short' with 'std::int16_t' +} |