Index: clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp +++ clang-tools-extra/clang-tidy/readability/UppercaseLiteralSuffixCheck.cpp @@ -134,6 +134,11 @@ CharSourceRange::getTokenRange(*Range), SM, LO, &Invalid); assert(!Invalid && "Failed to retrieve the source text."); + // Make sure the first character is actually a digit, instead of + // something else, like a non-type template parameter. + if (!std::isdigit(static_cast(LiteralSourceText.front()))) + return llvm::None; + size_t Skip = 0; // Do we need to ignore something before actually looking for the suffix? Index: clang-tools-extra/test/clang-tidy/checkers/readability-uppercase-literal-suffix-integer.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-uppercase-literal-suffix-integer.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-uppercase-literal-suffix-integer.cpp @@ -270,3 +270,29 @@ void d(); void d() { c(); } } // namespace + +// Check that non-type template parameters do not cause any diags. +// https://bugs.llvm.org/show_bug.cgi?id=51790 +template +struct Vector { + static constexpr int kCapacity = capacity; +}; + +template +constexpr int Vector::kCapacity; +// CHECK-MESSAGES-NOT: :[[@LINE-1]]:22: warning: integer literal has suffix 'ity', which is not uppercase + +template +struct Foo { + static constexpr int kFoo = foo1u; +}; + +template +constexpr int Foo::kFoo; +// CHECK-MESSAGES-NOT: :[[@LINE-1]]:19: warning: integer literal has suffix 'u', which is not uppercase + +// The template needs to be instantiated for diagnostics to show up +void test_non_type_template_parameter() { + int x = Vector<10>::kCapacity; + int f = Foo<10>::kFoo; +}