forked from OSchip/llvm-project
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:
parent
9eab0da183
commit
b2a2c38349
|
@ -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?
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue