Kaydet (Commit) cbf5b21f authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Catch some misuses of VclPtr construction

...that go unnoticed due to the non-explicit VclPtr::oeprator reference_type *

Change-Id: Ia63edf8425d3ecb7c7f98eb56a710ac0cceccb67
üst c260580d
......@@ -57,7 +57,7 @@ ProgressMonitor::ProgressMonitor( const css::uno::Reference< XComponentContext >
m_xTopic_Bottom.set( rxContext->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME, rxContext ), UNO_QUERY );
m_xText_Bottom.set ( rxContext->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME, rxContext ), UNO_QUERY );
m_xButton.set ( rxContext->getServiceManager()->createInstanceWithContext( BUTTON_SERVICENAME, rxContext ), UNO_QUERY );
m_xProgressBar = VclPtr<ProgressBar>::Create(rxContext);
m_xProgressBar = new ProgressBar(rxContext);
// ... cast controls to Reference< XControl > (for "setModel"!) ...
css::uno::Reference< XControl > xRef_Topic_Top ( m_xTopic_Top , UNO_QUERY );
......
......@@ -46,7 +46,7 @@ StatusIndicator::StatusIndicator( const css::uno::Reference< XComponentContext >
// Create instances for fixedtext and progress ...
m_xText.set( rxContext->getServiceManager()->createInstanceWithContext( FIXEDTEXT_SERVICENAME, rxContext ), UNO_QUERY );
m_xProgressBar = VclPtr<ProgressBar>::Create(rxContext);
m_xProgressBar = new ProgressBar(rxContext);
// ... cast controls to css::uno::Reference< XControl > and set model ...
// ( ProgressBar has no model !!! )
css::uno::Reference< XControl > xTextControl ( m_xText , UNO_QUERY );
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment