src/checks/level2/static-pmf.cpp (32 lines of code) (raw):

/* SPDX-FileCopyrightText: 2018 Sergio Martins <smartins@kde.org> SPDX-License-Identifier: LGPL-2.0-or-later */ #include "static-pmf.h" #include "QtUtils.h" #include "TypeUtils.h" #include <clang/AST/Decl.h> #include <clang/AST/Type.h> #include <clang/Basic/LLVM.h> #include <llvm/Support/Casting.h> using namespace clang; StaticPmf::StaticPmf(const std::string &name, ClazyContext *context) : CheckBase(name, context) { } void StaticPmf::VisitDecl(clang::Decl *decl) { auto *vardecl = dyn_cast<VarDecl>(decl); if (!vardecl || !vardecl->isStaticLocal()) { return; } const Type *t = clazy::unpealAuto(vardecl->getType()); if (!t) { return; } const auto *memberPointerType = dyn_cast<clang::MemberPointerType>(t); if (!memberPointerType || !memberPointerType->isMemberFunctionPointer()) { return; } auto *record = memberPointerType->getMostRecentCXXRecordDecl(); if (!clazy::isQObject(record)) { return; } emitWarning(vardecl, "Static pointer to member has portability issues"); }