[Clang-tidy] Check the existence of ElaboratedType's qualifiers

The ElaboratedType can have no qualifiers, so we should check it before
use.

Fix #issue53874(https://github.com/llvm/llvm-project/issues/53874)

Differential Revision: https://reviews.llvm.org/D119949
This commit is contained in:
Jun Zhang 2022-02-16 23:48:27 +08:00
parent 70ab0a9b62
commit ac616fbb05
No known key found for this signature in database
GPG Key ID: E19904830B621534
2 changed files with 37 additions and 10 deletions

View File

@ -19,14 +19,15 @@ namespace readability {
static unsigned getNameSpecifierNestingLevel(const QualType &QType) {
if (const ElaboratedType *ElType = QType->getAs<ElaboratedType>()) {
const NestedNameSpecifier *NestedSpecifiers = ElType->getQualifier();
unsigned NameSpecifierNestingLevel = 1;
do {
NameSpecifierNestingLevel++;
NestedSpecifiers = NestedSpecifiers->getPrefix();
} while (NestedSpecifiers);
if (const NestedNameSpecifier *NestedSpecifiers = ElType->getQualifier()) {
unsigned NameSpecifierNestingLevel = 1;
do {
NameSpecifierNestingLevel++;
NestedSpecifiers = NestedSpecifiers->getPrefix();
} while (NestedSpecifiers);
return NameSpecifierNestingLevel;
return NameSpecifierNestingLevel;
}
}
return 0;
}
@ -68,6 +69,10 @@ void StaticAccessedThroughInstanceCheck::check(
PrintingPolicy PrintingPolicyWithSupressedTag(AstContext->getLangOpts());
PrintingPolicyWithSupressedTag.SuppressTagKeyword = true;
PrintingPolicyWithSupressedTag.SuppressUnwrittenScope = true;
PrintingPolicyWithSupressedTag.PrintCanonicalTypes =
!BaseExpr->getType()->isTypedefNameType();
std::string BaseTypeName =
BaseType.getAsString(PrintingPolicyWithSupressedTag);

View File

@ -198,6 +198,28 @@ void static_through_instance() {
h<4>();
}
struct SP {
static int I;
} P;
void usep() {
P.I;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member
// CHECK-FIXES: {{^}} SP::I;{{$}}
}
namespace NSP {
struct SP {
static int I;
} P;
} // namespace NSP
void usensp() {
NSP::P.I;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member
// CHECK-FIXES: {{^}} NSP::SP::I;{{$}}
}
// Overloaded member access operator
struct Q {
static int K;
@ -237,9 +259,9 @@ void use_anonymous() {
namespace Outer {
inline namespace Inline {
struct S {
static int I;
};
struct S {
static int I;
};
}
}