Catch some misuses of VclPtr construction
...that go unnoticed due to the non-explicit VclPtr::oeprator reference_type * Change-Id: Ia63edf8425d3ecb7c7f98eb56a710ac0cceccb67
This commit is contained in:
@@ -825,19 +825,38 @@ bool VCLWidgets::VisitCXXConstructExpr( const CXXConstructExpr* constructExpr )
|
||||
if (ignoreLocation(constructExpr)) {
|
||||
return true;
|
||||
}
|
||||
StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(constructExpr->getLocStart()));
|
||||
if (aFileName == SRCDIR "/include/vcl/vclptr.hxx")
|
||||
return true;
|
||||
if (constructExpr->getConstructionKind() != CXXConstructExpr::CK_Complete) {
|
||||
return true;
|
||||
}
|
||||
const CXXConstructorDecl* pConstructorDecl = constructExpr->getConstructor();
|
||||
const CXXRecordDecl* recordDecl = pConstructorDecl->getParent();
|
||||
if (isDerivedFromVclReferenceBase(recordDecl)) {
|
||||
report(
|
||||
DiagnosticsEngine::Warning,
|
||||
"Calling constructor of a VclReferenceBase-derived type directly; all such creation should go via VclPtr<>::Create",
|
||||
constructExpr->getExprLoc());
|
||||
StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(constructExpr->getLocStart()));
|
||||
if (aFileName != SRCDIR "/include/vcl/vclptr.hxx") {
|
||||
report(
|
||||
DiagnosticsEngine::Warning,
|
||||
"Calling constructor of a VclReferenceBase-derived type directly; all such creation should go via VclPtr<>::Create",
|
||||
constructExpr->getExprLoc());
|
||||
}
|
||||
} else if (auto d = dyn_cast<ClassTemplateSpecializationDecl>(recordDecl)) {
|
||||
if (d->getTemplateArgs().size() == 1) {
|
||||
auto check = loplugin::DeclCheck(recordDecl);
|
||||
if ((check.Class("ScopedVclPtr").GlobalNamespace()
|
||||
|| check.Class("ScopedVclPtrInstance").GlobalNamespace()
|
||||
|| check.Class("VclPtr").GlobalNamespace()
|
||||
|| check.Class("VclPtrInstance").GlobalNamespace()))
|
||||
{
|
||||
auto t = d->getTemplateArgs()[0].getAsType();
|
||||
if (!containsVclReferenceBaseSubclass(t)) {
|
||||
report(
|
||||
DiagnosticsEngine::Warning,
|
||||
("constructing an instance of %0 where the argument"
|
||||
" type %1 is not derived from VclReferenceBase"),
|
||||
constructExpr->getExprLoc())
|
||||
<< recordDecl << t << constructExpr->getSourceRange();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user