Differential D89638 Diff 298860 clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
Show First 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | void visitRecordDecl(const RecordDecl *RD) const { | ||||
if (shouldSkipDecl(RD)) | if (shouldSkipDecl(RD)) | ||||
return; | return; | ||||
for (auto Member : RD->fields()) { | for (auto Member : RD->fields()) { | ||||
const Type *MemberType = Member->getType().getTypePtrOrNull(); | const Type *MemberType = Member->getType().getTypePtrOrNull(); | ||||
if (!MemberType) | if (!MemberType) | ||||
continue; | continue; | ||||
if (Member->hasAttr<NoNoUncountedMemberAttr>()) | |||||
continue; | |||||
if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) { | if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) { | ||||
// If we don't see the definition we just don't know. | // If we don't see the definition we just don't know. | ||||
if (MemberCXXRD->hasDefinition()) { | if (MemberCXXRD->hasDefinition()) { | ||||
llvm::Optional<bool> isRCAble = isRefCountable(MemberCXXRD); | llvm::Optional<bool> isRCAble = isRefCountable(MemberCXXRD); | ||||
if (isRCAble && *isRCAble) | if (isRCAble && *isRCAble) | ||||
reportBug(Member, MemberType, MemberCXXRD, RD); | reportBug(Member, MemberType, MemberCXXRD, RD); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 74 Lines • Show Last 20 Lines |