[Libreoffice-commits] core.git: compilerplugins/clang UnoControls/source

Stephan Bergmann sbergman at redhat.com
Fri Dec 9 19:01:15 UTC 2016


 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 <sbergman at redhat.com>
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;
 }


More information about the Libreoffice-commits mailing list