Fix bug in readability-uppercase-literal-suffix

Fixes https://bugs.llvm.org/show_bug.cgi?id=51790. The check triggers
incorrectly with non-type template parameters.

A bisect determined that the bug was introduced here:
ea2225a10b

Unfortunately that patch can no longer be reverted on top of the main
branch, so add a fix instead. Add a unit test to avoid regression in
the future.
This commit is contained in:
Carlos Galvez 2021-09-27 14:02:53 -04:00 committed by Aaron Ballman
parent 9eab0da183
commit b2a2c38349
2 changed files with 31 additions and 0 deletions

View File

@ -134,6 +134,11 @@ shouldReplaceLiteralSuffix(const Expr &Literal,
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<unsigned char>(LiteralSourceText.front())))
return llvm::None;
size_t Skip = 0;
// Do we need to ignore something before actually looking for the suffix?

View File

@ -270,3 +270,29 @@ void c() { l &a(); }
void d();
void d() { c<b>(); }
} // namespace
// Check that non-type template parameters do not cause any diags.
// https://bugs.llvm.org/show_bug.cgi?id=51790
template <int capacity>
struct Vector {
static constexpr int kCapacity = capacity;
};
template <int capacity>
constexpr int Vector<capacity>::kCapacity;
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:22: warning: integer literal has suffix 'ity', which is not uppercase
template <int foo1u>
struct Foo {
static constexpr int kFoo = foo1u;
};
template <int foo1u>
constexpr int Foo<foo1u>::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;
}