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

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Thu Sep 26 06:05:32 UTC 2019


 compilerplugins/clang/virtualdead.cxx     |  267 ++++++++++++++++++++++++++
 compilerplugins/clang/virtualdead.py      |   63 ++++++
 compilerplugins/clang/virtualdead.results |  303 ++++++++++++++++++++++++++++++
 3 files changed, 633 insertions(+)

New commits:
commit e7a1d057c414b78fdd685f1de0008efc820bfa51
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Wed Sep 25 18:25:20 2019 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Thu Sep 26 08:04:37 2019 +0200

    new loplugin virtualdead
    
    to look for virtual methods where all of the implementations of that
    method do nothing useful
    
    Change-Id: I623456ade1c55fe8048d23f69cb692540378daa4
    Reviewed-on: https://gerrit.libreoffice.org/79579
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/compilerplugins/clang/virtualdead.cxx b/compilerplugins/clang/virtualdead.cxx
new file mode 100644
index 000000000000..dd6e311193b8
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.cxx
@@ -0,0 +1,267 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "plugin.hxx"
+#include "check.hxx"
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <set>
+#include <fstream>
+
+/**
+Look for virtual methods where all of the overrides either
+(a) do nothing
+(b) all return the same value
+
+The process goes something like this:
+  $ make check
+  $ make FORCE_COMPILE_ALL=1 COMPILER_PLUGIN_TOOL='VirtualDead' check
+  $ ./compilerplugins/clang/VirtualDead.py
+  $ for dir in *; do make FORCE_COMPILE_ALL=1 UPDATE_FILES=$dir COMPILER_PLUGIN_TOOL='removevirtuals' $dir; done
+
+Note that the actual process may involve a fair amount of undoing, hand editing, and general messing around
+to get it to work :-)
+*/
+
+namespace
+{
+struct MyFuncInfo
+{
+    std::string name;
+    std::string sourceLocation;
+    std::string returnValue;
+};
+bool operator<(const MyFuncInfo& lhs, const MyFuncInfo& rhs)
+{
+    return std::tie(lhs.name, lhs.returnValue) < std::tie(rhs.name, rhs.returnValue);
+}
+
+// try to limit the voluminous output a little
+static std::set<MyFuncInfo> definitionSet;
+
+class VirtualDead : public RecursiveASTVisitor<VirtualDead>, public loplugin::Plugin
+{
+public:
+    explicit VirtualDead(loplugin::InstantiationData const& data)
+        : Plugin(data)
+    {
+    }
+
+    virtual void run() override
+    {
+        TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+
+        // dump all our output in one write call - this is to try and limit IO "crosstalk" between multiple processes
+        // writing to the same logfile
+        std::string output;
+        for (const MyFuncInfo& s : definitionSet)
+            output += "virtual:\t" + s.name + "\t" + s.sourceLocation + "\t" + s.returnValue + "\n";
+        std::ofstream myfile;
+        myfile.open(WORKDIR "/loplugin.virtualdead.log", std::ios::app | std::ios::out);
+        myfile << output;
+        myfile.close();
+    }
+    bool shouldVisitTemplateInstantiations() const { return true; }
+    bool shouldVisitImplicitCode() const { return true; }
+
+    bool VisitCXXMethodDecl(const CXXMethodDecl* decl);
+
+private:
+    std::string getCallValue(const Expr* arg);
+    std::string toString(SourceLocation loc);
+    void markSuperclassMethods(const CXXMethodDecl* methodDecl, std::string returnValue);
+};
+
+std::string niceName(const CXXMethodDecl* cxxMethodDecl)
+{
+    while (cxxMethodDecl->getTemplateInstantiationPattern())
+        cxxMethodDecl = dyn_cast<CXXMethodDecl>(cxxMethodDecl->getTemplateInstantiationPattern());
+    while (cxxMethodDecl->getInstantiatedFromMemberFunction())
+        cxxMethodDecl = dyn_cast<CXXMethodDecl>(cxxMethodDecl->getInstantiatedFromMemberFunction());
+    std::string s = cxxMethodDecl->getReturnType().getCanonicalType().getAsString() + " "
+                    + cxxMethodDecl->getQualifiedNameAsString() + "(";
+    for (const ParmVarDecl* pParmVarDecl : cxxMethodDecl->parameters())
+    {
+        s += pParmVarDecl->getType().getCanonicalType().getAsString();
+        s += ",";
+    }
+    s += ")";
+    if (cxxMethodDecl->isConst())
+    {
+        s += "const";
+    }
+    return s;
+}
+
+bool VirtualDead::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
+{
+    if (ignoreLocation(methodDecl))
+        return true;
+    if (!methodDecl->isVirtual() || methodDecl->isDeleted())
+        return true;
+    if (isa<CXXDestructorDecl>(methodDecl))
+        return true;
+    // ignore stuff that forms part of the stable URE interface
+    if (isInUnoIncludeFile(methodDecl->getCanonicalDecl()))
+        return true;
+
+    if (!methodDecl->isThisDeclarationADefinition())
+        return true;
+
+    std::string returnValue;
+
+    auto body = methodDecl->getBody();
+    if (body)
+    {
+        auto compoundStmt = dyn_cast<CompoundStmt>(body);
+        if (!compoundStmt)
+            returnValue = "empty";
+        else if (compoundStmt->size() == 0)
+            returnValue = "empty";
+        else
+        {
+            if (auto returnStmt = dyn_cast<ReturnStmt>(*compoundStmt->body_begin()))
+            {
+                if (!returnStmt->getRetValue())
+                    returnValue = "empty";
+                else
+                    returnValue = getCallValue(returnStmt->getRetValue());
+            }
+            else
+                returnValue = "unknown-stmt";
+        }
+    }
+    else
+        returnValue = "empty";
+
+    markSuperclassMethods(methodDecl, returnValue);
+
+    return true;
+}
+
+void VirtualDead::markSuperclassMethods(const CXXMethodDecl* methodDecl, std::string returnValue)
+{
+    if (methodDecl->size_overridden_methods() == 0)
+    {
+        std::string aNiceName = niceName(methodDecl);
+        definitionSet.insert(
+            { aNiceName, toString(methodDecl->getCanonicalDecl()->getLocation()), returnValue });
+        return;
+    }
+
+    for (auto iter = methodDecl->begin_overridden_methods();
+         iter != methodDecl->end_overridden_methods(); ++iter)
+    {
+        const CXXMethodDecl* overriddenMethod = *iter;
+        markSuperclassMethods(overriddenMethod, returnValue);
+    }
+}
+
+std::string VirtualDead::getCallValue(const Expr* arg)
+{
+    arg = arg->IgnoreParenCasts();
+    if (isa<CXXDefaultArgExpr>(arg))
+    {
+        arg = dyn_cast<CXXDefaultArgExpr>(arg)->getExpr();
+    }
+    arg = arg->IgnoreParenCasts();
+    // ignore this, it seems to trigger an infinite recursion
+    if (isa<UnaryExprOrTypeTraitExpr>(arg))
+        return "unknown1";
+    if (arg->isValueDependent())
+        return "unknown2";
+    APSInt x1;
+    if (compat::EvaluateAsInt(arg, x1, compiler.getASTContext()))
+    {
+        return x1.toString(10);
+    }
+    if (isa<CXXNullPtrLiteralExpr>(arg))
+    {
+        return "0";
+    }
+    if (isa<MaterializeTemporaryExpr>(arg))
+    {
+        const CXXBindTemporaryExpr* strippedArg
+            = dyn_cast_or_null<CXXBindTemporaryExpr>(arg->IgnoreParenCasts());
+        if (strippedArg)
+        {
+            auto temp = dyn_cast<CXXTemporaryObjectExpr>(strippedArg->getSubExpr());
+            if (temp->getNumArgs() == 0)
+            {
+                if (loplugin::TypeCheck(temp->getType())
+                        .Class("OUString")
+                        .Namespace("rtl")
+                        .GlobalNamespace())
+                {
+                    return "\"\"";
+                }
+                if (loplugin::TypeCheck(temp->getType())
+                        .Class("OString")
+                        .Namespace("rtl")
+                        .GlobalNamespace())
+                {
+                    return "\"\"";
+                }
+                return "defaultConstruct";
+            }
+        }
+    }
+
+    // Get the expression contents.
+    // This helps us find params which are always initialised with something like "OUString()".
+    SourceManager& SM = compiler.getSourceManager();
+    SourceLocation startLoc = compat::getBeginLoc(arg);
+    SourceLocation endLoc = compat::getEndLoc(arg);
+    const char* p1 = SM.getCharacterData(startLoc);
+    const char* p2 = SM.getCharacterData(endLoc);
+    if (!p1 || !p2 || (p2 - p1) < 0 || (p2 - p1) > 40)
+    {
+        return "unknown3";
+    }
+    unsigned n = Lexer::MeasureTokenLength(endLoc, SM, compiler.getLangOpts());
+    std::string s(p1, p2 - p1 + n);
+    // strip linefeed and tab characters so they don't interfere with the parsing of the log file
+    std::replace(s.begin(), s.end(), '\r', ' ');
+    std::replace(s.begin(), s.end(), '\n', ' ');
+    std::replace(s.begin(), s.end(), '\t', ' ');
+
+    // now normalize the value. For some params, like OUString, we can pass it as OUString() or "" and they are the same thing
+    if (s == "OUString()")
+        s = "\"\"";
+    else if (s == "OString()")
+        s = "\"\"";
+    else if (s == "aEmptyOUStr") //sw
+        s = "\"\"";
+    else if (s == "EMPTY_OUSTRING") //sc
+        s = "\"\"";
+    else if (s == "GetEmptyOUString()") //sc
+        s = "\"\"";
+
+    if (s[0] == '"' || s[0] == '\'')
+        return s;
+    return "unknown4";
+}
+
+std::string VirtualDead::toString(SourceLocation loc)
+{
+    SourceLocation expansionLoc = compiler.getSourceManager().getExpansionLoc(loc);
+    StringRef name = compiler.getSourceManager().getFilename(expansionLoc);
+    std::string sourceLocation
+        = std::string(name.substr(strlen(SRCDIR) + 1)) + ":"
+          + std::to_string(compiler.getSourceManager().getSpellingLineNumber(expansionLoc));
+    loplugin::normalizeDotDotInFilePath(sourceLocation);
+    return sourceLocation;
+}
+
+loplugin::Plugin::Registration<VirtualDead> X("virtualdead", false);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/virtualdead.py b/compilerplugins/clang/virtualdead.py
new file mode 100755
index 000000000000..e32b5d788cb5
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+import sys
+import re
+import io
+
+callDict = dict() # callInfo tuple -> callValue
+
+# clang does not always use exactly the same numbers in the type-parameter vars it generates
+# so I need to substitute them to ensure we can match correctly.
+normalizeTypeParamsRegex = re.compile(r"type-parameter-\d+-\d+")
+def normalizeTypeParams( line ):
+    return normalizeTypeParamsRegex.sub("type-parameter-?-?", line)
+
+# reading as binary (since we known it is pure ascii) is much faster than reading as unicode
+with io.open("workdir/loplugin.virtualdead.log", "rb", buffering=1024*1024) as txt:
+    for line in txt:
+        try:
+            tokens = line.strip().split("\t")
+            nameAndParams = normalizeTypeParams(tokens[1])
+            sourceLocation = tokens[2]
+            returnValue = tokens[3]
+            callInfo = (nameAndParams, sourceLocation)
+            if not callInfo in callDict:
+                callDict[callInfo] = set()
+            callDict[callInfo].add(returnValue)
+        except IndexError:
+            print "problem with line " + line.strip()
+            raise
+
+tmp1list = list()
+for callInfo, callValues in callDict.iteritems():
+    nameAndParams = callInfo[1]
+    if len(callValues) != 1:
+        continue
+    callValue = next(iter(callValues))
+    if "unknown-stmt" in callValue:
+        continue
+    if "unknown3" in callValue:
+        continue
+    if "unknown4" in callValue:
+        continue
+    if "pure" in callValue:
+        continue
+    sourceLoc = callInfo[1]
+    if sourceLoc.startswith("workdir/"):
+        continue
+    functionSig = callInfo[0]
+    tmp1list.append((sourceLoc, functionSig, callValue))
+
+
+# sort results by filename:lineno
+def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
+    return [int(text) if text.isdigit() else text.lower()
+            for text in re.split(_nsre, s)]
+tmp1list.sort(key=lambda v: natural_sort_key(v[0]))
+
+# print out the results
+with open("compilerplugins/clang/virtualdead.results", "wt") as f:
+    for v in tmp1list:
+        f.write(v[0] + "\n")
+        f.write("    " + v[1] + "\n")
+        f.write("    " + v[2] + "\n")
diff --git a/compilerplugins/clang/virtualdead.results b/compilerplugins/clang/virtualdead.results
new file mode 100644
index 000000000000..dbe267b1ee4f
--- /dev/null
+++ b/compilerplugins/clang/virtualdead.results
@@ -0,0 +1,303 @@
+basctl/source/inc/bastypes.hxx:191
+    _Bool basctl::BaseWindow::CanClose()
+    1
+basic/source/comp/codegen.cxx:464
+    void OffSetAccumulator::start(const unsigned char *,)
+    empty
+basic/source/comp/codegen.cxx:476
+    _Bool OffSetAccumulator::processParams()
+    0
+basic/source/comp/codegen.cxx:526
+    _Bool BufferTransformer::processParams()
+    1
+chart2/source/controller/dialogs/ChartTypeDialogController.hxx:99
+    _Bool chart::ChartTypeDialogController::shouldShow_DeepStackingControl()const
+    0
+chart2/source/controller/sidebar/ChartSidebarSelectionListener.hxx:30
+    void chart::sidebar::ChartSidebarSelectionListenerParent::SelectionInvalid()
+    empty
+dbaccess/source/ui/inc/IUpdateHelper.hxx:38
+    void dbaui::IUpdateHelper::moveToInsertRow()
+    empty
+desktop/source/deployment/registry/inc/dp_backenddb.hxx:119
+    class rtl::OUString dp_registry::backend::BackendDb::getDbNSName()
+    "http://openoffi
+extensions/source/bibliography/loadlisteneradapter.hxx:111
+    void bib::OLoadListener::_unloaded(const struct com::sun::star::lang::EventObject &,)
+    empty
+extensions/source/propctrlr/commoncontrol.hxx:127
+    short pcr::CommonBehaviourControl::getControlType()
+    unknown2
+extensions/source/propctrlr/commoncontrol.hxx:129
+    class com::sun::star::uno::Reference<class com::sun::star::inspection::XPropertyControlContext> pcr::CommonBehaviourControl::getControlContext()
+    unknown2
+extensions/source/propctrlr/commoncontrol.hxx:133
+    class com::sun::star::uno::Reference<class com::sun::star::awt::XWindow> pcr::CommonBehaviourControl::getControlWindow()
+    unknown2
+extensions/source/propctrlr/commoncontrol.hxx:135
+    unsigned char pcr::CommonBehaviourControl::isModified()
+    unknown2
+forms/source/xforms/datatypes.hxx:237
+    class com::sun::star::uno::Reference<class com::sun::star::beans::XPropertySetInfo> xforms::ODerivedDataType::getPropertySetInfo()
+    unknown2
+forms/source/xforms/namedcollection.hxx:80
+    class com::sun::star::uno::Type NamedCollection::getElementType()
+    unknown2
+forms/source/xforms/namedcollection.hxx:85
+    unsigned char NamedCollection::hasElements()
+    unknown2
+forms/source/xforms/namedcollection.hxx:99
+    class com::sun::star::uno::Sequence<class rtl::OUString> NamedCollection::getElementNames()
+    unknown2
+forms/source/xforms/namedcollection.hxx:104
+    unsigned char NamedCollection::hasByName(const class rtl::OUString &,)
+    unknown2
+Gui/qaccessible.h:465
+    class QObject * QAccessibleInterface::object()const
+    0
+Gui/qaccessible.h:466
+    class QWindow * QAccessibleInterface::window()const
+    0
+Gui/qaccessible.h:478
+    int QAccessibleInterface::indexOfChild(const class QAccessibleInterface *,)const
+    0
+Gui/qaccessible.h:482
+    void QAccessibleInterface::setText(enum QAccessible::Text,const class QString &,)
+    empty
+Gui/qaccessible.h:612
+    _Bool QAccessibleTableInterface::isColumnSelected(int,)const
+    1
+Gui/qaccessible.h:613
+    _Bool QAccessibleTableInterface::isRowSelected(int,)const
+    1
+Gui/qaccessible.h:619
+    void QAccessibleTableInterface::modelChange(class QAccessibleTableModelChangeEvent *,)
+    empty
+include/basegfx/utils/systemdependentdata.hxx:122
+    unsigned int basegfx::SystemDependentData::getHoldCyclesInSeconds()const
+    60
+include/basegfx/utils/unopolypolygon.hxx:97
+    void basegfx::unotools::UnoPolyPolygon::modifying()const
+    empty
+include/canvas/base/bitmapcanvasbase.hxx:80
+    unsigned char canvas::BitmapCanvasBase::hasAlpha()
+    1
+include/canvas/base/bufferedgraphicdevicebase.hxx:95
+    class com::sun::star::uno::Reference<class com::sun::star::rendering::XBufferController> canvas::BufferedGraphicDeviceBase::getBufferController()
+    unknown2
+include/canvas/base/bufferedgraphicdevicebase.hxx:108
+    void canvas::BufferedGraphicDeviceBase::destroyBuffers()
+    empty
+include/canvas/base/graphicdevicebase.hxx:230
+    class com::sun::star::uno::Reference<class com::sun::star::lang::XMultiServiceFactory> canvas::GraphicDeviceBase::getParametricPolyPolygonFactory()
+    unknown2
+include/canvas/base/graphicdevicebase.hxx:235
+    unsigned char canvas::GraphicDeviceBase::hasFullScreenMode()
+    0
+include/canvas/base/graphicdevicebase.hxx:240
+    unsigned char canvas::GraphicDeviceBase::enterFullScreenMode(unsigned char,)
+    0
+include/canvas/base/graphicdevicebase.hxx:246
+    class com::sun::star::uno::Reference<class com::sun::star::uno::XInterface> canvas::GraphicDeviceBase::createInstance(const class rtl::OUString &,)
+    unknown2
+include/canvas/base/graphicdevicebase.hxx:254
+    class com::sun::star::uno::Reference<class com::sun::star::uno::XInterface> canvas::GraphicDeviceBase::createInstanceWithArguments(const class rtl::OUString &,const class com::sun::star::uno::Sequence<class com::sun::star::uno::Any> &,)
+    unknown2
+include/canvas/base/graphicdevicebase.hxx:306
+    void canvas::GraphicDeviceBase::removePropertyChangeListener(const class rtl::OUString &,const class com::sun::star::uno::Reference<class com::sun::star::beans::XPropertyChangeListener> &,)
+    empty
+include/canvas/base/graphicdevicebase.hxx:319
+    void canvas::GraphicDeviceBase::removeVetoableChangeListener(const class rtl::OUString &,const class com::sun::star::uno::Reference<class com::sun::star::beans::XVetoableChangeListener> &,)
+    empty
+include/comphelper/servicedecl.hxx:164
+    class rtl::OUString comphelper::service_decl::detail::OwnServiceImpl::getImplementationName()
+    unknown2
+include/comphelper/servicedecl.hxx:167
+    unsigned char comphelper::service_decl::detail::OwnServiceImpl::supportsService(const class rtl::OUString &,)
+    unknown2
+include/comphelper/servicedecl.hxx:171
+    class com::sun::star::uno::Sequence<class rtl::OUString> comphelper::service_decl::detail::OwnServiceImpl::getSupportedServiceNames()
+    unknown2
+include/connectivity/sdbcx/IRefreshable.hxx:31
+    void connectivity::sdbcx::IRefreshableGroups::refreshGroups()
+    empty
+include/editeng/splwrap.hxx:105
+    _Bool SvxSpellWrapper::HasOtherCnt()
+    0
+include/filter/msfilter/msdffimp.hxx:546
+    _Bool SvxMSDffManager::ShapeHasText(unsigned long,unsigned long,)const
+    1
+include/svl/svdde.hxx:237
+    class DdeData * DdeTopic::Get(enum SotClipboardFormatId,)
+    0
+include/svl/svdde.hxx:238
+    _Bool DdeTopic::Put(const class DdeData *,)
+    0
+include/svl/svdde.hxx:239
+    _Bool DdeTopic::Execute(const class rtl::OUString *,)
+    0
+include/svl/svdde.hxx:241
+    _Bool DdeTopic::MakeItem(const class rtl::OUString &,)
+    0
+include/svl/svdde.hxx:244
+    _Bool DdeTopic::StartAdviseLoop()
+    0
+include/svl/undo.hxx:168
+    void SfxUndoListener::undoManagerDying()
+    empty
+include/svtools/unoevent.hxx:199
+    unsigned short SvEventDescriptor::getMacroItemWhich()const
+    108
+include/svx/selectioncontroller.hxx:68
+    _Bool sdr::SelectionController::TakeFormatPaintBrush(class std::shared_ptr<class SfxItemSet> &,)
+    0
+include/svx/svdobj.hxx:711
+    _Bool SdrObject::IsNode()const
+    1
+include/test/text/xtextcontent.hxx:29
+    _Bool apitest::XTextContent::isAttachSupported()
+    1
+include/ucbhelper/resultset.hxx:425
+    void ucbhelper::ResultSetDataSupplier::close()
+    empty
+include/unotools/desktopterminationobserver.hxx:35
+    _Bool utl::ITerminationListener::queryTermination()const
+    1
+include/vbahelper/vbacollectionimpl.hxx:290
+    int ScVbaCollectionBase::getCount()
+    unknown2
+include/vbahelper/vbacollectionimpl.hxx:324
+    unsigned char ScVbaCollectionBase::hasElements()
+    unknown2
+include/vbahelper/vbahelperinterface.hxx:77
+    int InheritedHelperInterfaceImpl::getCreator()
+    1400204879
+include/vbahelper/vbahelperinterface.hxx:81
+    class com::sun::star::uno::Reference<class ooo::vba::XHelperInterface> InheritedHelperInterfaceImpl::getParent()
+    unknown2
+include/vbahelper/vbahelperinterface.hxx:91
+    class rtl::OUString InheritedHelperInterfaceImpl::getImplementationName()
+    unknown2
+include/vbahelper/vbareturntypes.hxx:41
+    type-parameter-?-? ooo::vba::DefaultReturnHelper::getValue()
+    unknown2
+include/vcl/accessibletable.hxx:94
+    class rtl::OUString vcl::table::IAccessibleTable::GetRowDescription(int,)const
+    "row description"
+include/vcl/accessibletable.hxx:96
+    class rtl::OUString vcl::table::IAccessibleTable::GetColumnDescription(unsigned short,)const
+    "col description"
+sc/source/core/opencl/formulagroupcl.cxx:1059
+    void sc::opencl::DynamicKernelSlidingArgument::GenSlidingWindowFunction(class std::__cxx11::basic_stringstream<char> &,)
+    empty
+sc/source/core/opencl/opbase.hxx:203
+    _Bool sc::opencl::OpBase::takeNumeric()const
+    1
+sc/source/ui/vba/vbacondition.hxx:41
+    class rtl::OUString ScVbaCondition::Formula1()
+    unknown2
+sc/source/ui/vba/vbacondition.hxx:42
+    class rtl::OUString ScVbaCondition::Formula2()
+    unknown2
+sc/source/ui/vba/vbasheetobject.hxx:117
+    class rtl::OUString ScVbaSheetObjectBase::implGetBaseName()const
+    "Button"
+sc/source/ui/vba/vbasheetobjects.cxx:141
+    class rtl::OUString ScVbaObjectContainer::implGetShapeServiceName()const
+    "com.sun.star.drawing.ControlShape"
+sd/source/ui/inc/smarttag.hxx:59
+    _Bool sd::SmartTag::RequestHelp(const class HelpEvent &,)
+    0
+sd/source/ui/inc/smarttag.hxx:171
+    _Bool sd::SmartHdl::isMarkable()const
+    0
+slideshow/source/engine/animationfactory.cxx:443
+    void slideshow::internal::(anonymous namespace)::GenericAnimation::prefetch(const class std::shared_ptr<class slideshow::internal::AnimatableShape> &,const class std::shared_ptr<class slideshow::internal::ShapeAttributeLayer> &,)
+    empty
+slideshow/source/inc/slide.hxx:118
+    void slideshow::internal::Slide::disablePaintOverlay()
+    empty
+svx/source/inc/docrecovery.hxx:162
+    void svx::DocRecovery::IRecoveryUpdateListener::start()
+    empty
+sw/inc/IDocumentState.hxx:48
+    void IDocumentState::SetLoaded()
+    empty
+sw/source/core/inc/swblocks.hxx:81
+    enum SwImpBlocks::FileType SwImpBlocks::GetFileType()const
+    3
+sw/source/uibase/inc/imaildsplistener.hxx:43
+    void IMailDispatcherListener::started(class rtl::Reference<class MailDispatcher>,)
+    empty
+sw/source/uibase/inc/imaildsplistener.hxx:48
+    void IMailDispatcherListener::stopped(class rtl::Reference<class MailDispatcher>,)
+    empty
+vcl/inc/salframe.hxx:145
+    void SalFrame::SetRepresentedURL(const class rtl::OUString &,)
+    empty
+vcl/inc/salframe.hxx:147
+    void SalFrame::DrawMenuBar()
+    empty
+vcl/inc/salframe.hxx:201
+    _Bool SalFrame::MapUnicodeToKeyCode(char16_t,struct o3tl::strong_int<unsigned short, struct LanguageTypeTag>,class vcl::KeyCode &,)
+    0
+vcl/inc/salgdiimpl.hxx:115
+    _Bool SalGraphicsImpl::drawPolyLineBezier(unsigned int,const struct SalPoint *,const enum PolyFlags *,)
+    0
+vcl/inc/salgdiimpl.hxx:120
+    _Bool SalGraphicsImpl::drawPolygonBezier(unsigned int,const struct SalPoint *,const enum PolyFlags *,)
+    0
+vcl/inc/salgdiimpl.hxx:125
+    _Bool SalGraphicsImpl::drawPolyPolygonBezier(unsigned int,const unsigned int *,const struct SalPoint *const *,const enum PolyFlags *const *,)
+    0
+vcl/inc/salgdiimpl.hxx:166
+    _Bool SalGraphicsImpl::drawEPS(long,long,long,long,void *,unsigned int,)
+    0
+vcl/inc/salinst.hxx:92
+    _Bool SalInstance::SVMainHook(int *,)
+    0
+vcl/inc/salmenu.hxx:77
+    void SalMenu::GetSystemMenuData(struct SystemMenuData *,)
+    empty
+vcl/inc/salmenu.hxx:80
+    _Bool SalMenu::AddMenuBarButton(const struct SalMenuButtonItem &,)
+    0
+vcl/inc/salmenu.hxx:81
+    void SalMenu::RemoveMenuBarButton(unsigned short,)
+    empty
+vcl/inc/salobj.hxx:49
+    void SalObject::Enable(_Bool,)
+    empty
+vcl/inc/salprn.hxx:85
+    int SalInfoPrinter::GetLandscapeAngle(const class ImplJobSetup *,)
+    900
+vcl/inc/salprn.hxx:116
+    enum SalPrinterError SalPrinter::GetErrorCode()
+    0
+vcl/inc/unx/saldata.hxx:54
+    void X11SalData::initNWF()
+    empty
+vcl/inc/unx/saldata.hxx:55
+    void X11SalData::deInitNWF()
+    empty
+vcl/inc/wizdlg.hxx:214
+    _Bool vcl::RoadmapWizard::leaveState(short,)
+    1
+writerfilter/inc/ooxml/OOXMLDocument.hxx:216
+    void writerfilter::ooxml::OOXMLDocument::setXNoteType(unsigned int,)
+    empty
+writerfilter/source/dmapper/LoggedResources.hxx:93
+    void writerfilter::LoggedStream::lcl_info(const class std::__cxx11::basic_string<char, struct std::char_traits<char>, class std::allocator<char> > &,)
+    empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:72
+    void writerfilter::ooxml::OOXMLFactory_ns::startAction(class writerfilter::ooxml::OOXMLFastContextHandler *,)
+    empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:73
+    void writerfilter::ooxml::OOXMLFactory_ns::charactersAction(class writerfilter::ooxml::OOXMLFastContextHandler *,const class rtl::OUString &,)
+    empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:74
+    void writerfilter::ooxml::OOXMLFactory_ns::endAction(class writerfilter::ooxml::OOXMLFastContextHandler *,)
+    empty
+writerfilter/source/ooxml/OOXMLFactory.hxx:75
+    void writerfilter::ooxml::OOXMLFactory_ns::attributeAction(class writerfilter::ooxml::OOXMLFastContextHandler *,int,const class tools::SvRef<class writerfilter::ooxml::OOXMLValue> &,)
+    empty


More information about the Libreoffice-commits mailing list