UnoControls/source/controls/progressmonitor.cxx | 2 - UnoControls/source/controls/statusindicator.cxx | 2 - compilerplugins/clang/vclwidgets.cxx | 33 ++++++++++++++++++------ 3 files changed, 28 insertions(+), 9 deletions(-)
New commits: commit cbf5b21f2a65bbb342295200f6ad93a00f90733e Author: Stephan Bergmann <[email protected]> Date: Fri Dec 9 20:00:26 2016 +0100 Catch some misuses of VclPtr construction ...that go unnoticed due to the non-explicit VclPtr::oeprator reference_type * Change-Id: Ia63edf8425d3ecb7c7f98eb56a710ac0cceccb67 diff --git a/UnoControls/source/controls/progressmonitor.cxx b/UnoControls/source/controls/progressmonitor.cxx index 7016e34..1cb5695 100644 --- a/UnoControls/source/controls/progressmonitor.cxx +++ b/UnoControls/source/controls/progressmonitor.cxx @@ -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 ); diff --git a/UnoControls/source/controls/statusindicator.cxx b/UnoControls/source/controls/statusindicator.cxx index 8df082e..a9c901d 100644 --- a/UnoControls/source/controls/statusindicator.cxx +++ b/UnoControls/source/controls/statusindicator.cxx @@ -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 ); diff --git a/compilerplugins/clang/vclwidgets.cxx b/compilerplugins/clang/vclwidgets.cxx index bb0ad54..e90e40f 100644 --- a/compilerplugins/clang/vclwidgets.cxx +++ b/compilerplugins/clang/vclwidgets.cxx @@ -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; } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
