// Find classes deriving from other classes with virtual member functions annotated with // SAL_LOPLUGIN_ANNOTATE("mustoverride"), but where the derived class fails to directly override // them.
#include <set>
#include"plugin.hxx"
namespace
{ void findMustOverride(CXXRecordDecl const* decl, std::set<CXXMethodDecl const*>* mustOverride)
{ for (autoconst& base : decl->bases())
{ autoconst d = base.getType()->getAsCXXRecordDecl(); if (d == nullptr)
{ continue;
}
findMustOverride(d, mustOverride); for (autoconst meth : d->methods())
{ if (!meth->isVirtual())
{ continue;
} for (autoconst attr : meth->specific_attrs<AnnotateAttr>())
{ if (attr->getAnnotation() == "loplugin:mustoverride")
{
mustOverride->insert(meth); break;
}
}
}
}
}
class MustOverride : public loplugin::FilteringPlugin<MustOverride>
{ public: explicit MustOverride(loplugin::InstantiationData const& data)
: FilteringPlugin(data)
{
}
bool VisitCXXRecordDecl(CXXRecordDecl const* decl)
{ if (ignoreLocation(decl))
{ returntrue;
} if (!decl->isThisDeclarationADefinition())
{ returntrue;
} if (!decl->isPolymorphic())
{ returntrue;
}
std::set<CXXMethodDecl const*> mustOverride;
findMustOverride(decl, &mustOverride); for (autoconst meth : mustOverride)
{ if (meth->getCorrespondingMethodDeclaredInClass(decl) != nullptr)
{ continue;
}
report(DiagnosticsEngine::Warning, "%0 does not override %1 from %2",
decl->getLocation())
<< decl << meth << meth->getParent() << decl->getSourceRange();
report(DiagnosticsEngine::Note, "declared here", meth->getLocation())
<< meth->getSourceRange();
} returntrue;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.10Bemerkung:
(vorverarbeitet am 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.