[Libreoffice-commits] core.git: 2 commits - avmedia/source bridges/inc compilerplugins/clang connectivity/source cui/source desktop/source extensions/source filter/source forms/source idlc/source include/formula sal/osl sc/source sd/source solenv/CompilerTest_compilerplugins_clang.mk svtools/source sw/source vcl/unx xmlsecurity/source

Noel Grandin noel.grandin at collabora.co.uk
Mon Dec 4 06:26:02 UTC 2017


 avmedia/source/viewer/mediawindow_impl.cxx                |   19 
 avmedia/source/viewer/mediawindow_impl.hxx                |    1 
 bridges/inc/bridge.hxx                                    |   17 
 bridges/inc/cppinterfaceproxy.hxx                         |    3 
 bridges/inc/unointerfaceproxy.hxx                         |   12 
 compilerplugins/clang/salcall.cxx                         |  370 ++++++++++++++
 compilerplugins/clang/singlevalfields.py                  |    5 
 compilerplugins/clang/singlevalfields.results             |  138 ++---
 compilerplugins/clang/test/salcall.cxx                    |  104 +++
 connectivity/source/drivers/odbc/ORealDriver.hxx          |    2 
 cui/source/customize/cfgutil.cxx                          |   12 
 cui/source/inc/cfgutil.hxx                                |    1 
 desktop/source/deployment/inc/dp_registry.hxx             |    2 
 extensions/source/propctrlr/eventhandler.hxx              |    2 
 extensions/source/propctrlr/genericpropertyhandler.hxx    |    2 
 extensions/source/scanner/scanunx.cxx                     |    4 
 filter/source/config/cache/contenthandlerfactory.hxx      |    2 
 filter/source/config/cache/filterfactory.hxx              |    2 
 filter/source/config/cache/frameloaderfactory.hxx         |    2 
 filter/source/config/cache/typedetection.hxx              |    2 
 filter/source/odfflatxml/OdfFlatXml.cxx                   |    2 
 forms/source/xforms/binding.hxx                           |    2 
 idlc/source/idlcproduce.cxx                               |    2 
 include/formula/FormulaOpCodeMapperObj.hxx                |    6 
 sal/osl/unx/file.cxx                                      |    2 
 sc/source/ui/inc/undodat.hxx                              |    1 
 sc/source/ui/undo/undodat.cxx                             |    4 
 sd/source/ui/inc/facreg.hxx                               |    4 
 solenv/CompilerTest_compilerplugins_clang.mk              |    1 
 svtools/source/uno/fpicker.hxx                            |    4 
 sw/source/filter/ww8/ww8graf2.cxx                         |    4 
 sw/source/filter/ww8/ww8par2.hxx                          |    2 
 sw/source/filter/ww8/ww8par6.cxx                          |    9 
 vcl/unx/generic/printer/printerinfomanager.cxx            |    2 
 vcl/unx/gtk/a11y/atklistener.hxx                          |    4 
 vcl/unx/gtk/a11y/atkutil.cxx                              |    4 
 xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx |    2 
 xmlsecurity/source/xmlsec/xsec_xmlsec.hxx                 |    2 
 38 files changed, 602 insertions(+), 157 deletions(-)

New commits:
commit f6b437c57d4b0b032cb7e0838e16572bdf9a05cc
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Fri Dec 1 15:27:21 2017 +0200

    loplugin:singlevalfields
    
    Change-Id: I521d2efa641f3a14c48561e2e0f6d687e5807d93
    Reviewed-on: https://gerrit.libreoffice.org/45662
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/avmedia/source/viewer/mediawindow_impl.cxx b/avmedia/source/viewer/mediawindow_impl.cxx
index f5d77615fb1e..e3045a63ece8 100644
--- a/avmedia/source/viewer/mediawindow_impl.cxx
+++ b/avmedia/source/viewer/mediawindow_impl.cxx
@@ -122,7 +122,6 @@ MediaWindowImpl::MediaWindowImpl(vcl::Window* pParent, MediaWindow* pMediaWindow
     , DropTargetHelper(this)
     , DragSourceHelper(this)
     , mpMediaWindow(pMediaWindow)
-    , mbEventTransparent(true)
     , mpMediaWindowControl(bInternalMediaControl ? VclPtr<MediaWindowControl>::Create(this) : nullptr)
     , mpEmptyBmpEx(nullptr)
     , mpAudioBmpEx(nullptr)
@@ -637,53 +636,53 @@ void MediaWindowImpl::GetFocus()
 
 void MediaWindowImpl::MouseMove(const MouseEvent& rMEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->MouseMove(rMEvt);
 }
 
 void MediaWindowImpl::MouseButtonDown(const MouseEvent& rMEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->MouseButtonDown(rMEvt);
 }
 
 void MediaWindowImpl::MouseButtonUp(const MouseEvent& rMEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->MouseButtonUp(rMEvt);
 }
 
 void MediaWindowImpl::KeyInput(const KeyEvent& rKEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->KeyInput(rKEvt);
 }
 
 void MediaWindowImpl::KeyUp(const KeyEvent& rKEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->KeyUp(rKEvt);
 }
 
 void MediaWindowImpl::Command(const CommandEvent& rCEvt)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->Command(rCEvt);
 }
 
 sal_Int8 MediaWindowImpl::AcceptDrop(const AcceptDropEvent& rEvt)
 {
-    return (mpMediaWindow && mbEventTransparent ? mpMediaWindow->AcceptDrop(rEvt) : 0);
+    return (mpMediaWindow ? mpMediaWindow->AcceptDrop(rEvt) : 0);
 }
 
 sal_Int8 MediaWindowImpl::ExecuteDrop(const ExecuteDropEvent& rEvt)
 {
-    return (mpMediaWindow && mbEventTransparent ? mpMediaWindow->ExecuteDrop(rEvt) : 0);
+    return (mpMediaWindow ? mpMediaWindow->ExecuteDrop(rEvt) : 0);
 }
 
 void MediaWindowImpl::StartDrag(sal_Int8 nAction, const Point& rPosPixel)
 {
-    if (mpMediaWindow && mbEventTransparent)
+    if (mpMediaWindow)
         mpMediaWindow->StartDrag(nAction, rPosPixel);
 }
 
diff --git a/avmedia/source/viewer/mediawindow_impl.hxx b/avmedia/source/viewer/mediawindow_impl.hxx
index 3b100c36e324..bed32852e5ce 100644
--- a/avmedia/source/viewer/mediawindow_impl.hxx
+++ b/avmedia/source/viewer/mediawindow_impl.hxx
@@ -147,7 +147,6 @@ private:
     MediaWindow* mpMediaWindow;
 
     rtl::Reference<MediaEventListenersImpl> mxEvents;
-    bool mbEventTransparent;
     VclPtr<MediaChildWindow> mpChildWindow;
     VclPtr<MediaWindowControl> mpMediaWindowControl;
     BitmapEx* mpEmptyBmpEx;
diff --git a/compilerplugins/clang/singlevalfields.py b/compilerplugins/clang/singlevalfields.py
index 5ed8c939bcea..855f3d5ae58f 100755
--- a/compilerplugins/clang/singlevalfields.py
+++ b/compilerplugins/clang/singlevalfields.py
@@ -26,7 +26,10 @@ with io.open("loplugin.singlevalfields.log", "rb", buffering=1024*1024) as txt:
         elif tokens[0] == "asgn:":
             parentClass = normalizeTypeParams(tokens[1])
             fieldName = normalizeTypeParams(tokens[2])
-            assignValue = tokens[3]
+            if len(tokens) > 3:
+                assignValue = tokens[3]
+            else:
+                assignValue = ""
             fieldInfo = (parentClass, fieldName)
             if not fieldInfo in fieldAssignDict:
                 fieldAssignDict[fieldInfo] = set()
diff --git a/compilerplugins/clang/singlevalfields.results b/compilerplugins/clang/singlevalfields.results
index 715700b6f0f3..b99868b50374 100644
--- a/compilerplugins/clang/singlevalfields.results
+++ b/compilerplugins/clang/singlevalfields.results
@@ -1,4 +1,7 @@
-chart2/source/model/main/DataPoint.hxx:109
+avmedia/source/viewer/mediawindow_impl.hxx:150
+    avmedia::priv::MediaWindowImpl mbEventTransparent
+    1
+chart2/source/model/main/DataPoint.hxx:107
     chart::DataPoint m_bNoParentPropAllowed
     0
 chart2/source/view/inc/GL3DRenderer.hxx:161
@@ -7,74 +10,62 @@ chart2/source/view/inc/GL3DRenderer.hxx:161
 connectivity/source/inc/odbc/OBoundParam.hxx:113
     connectivity::odbc::OBoundParam paramLength
     0
-connectivity/source/inc/OTypeInfo.hxx:37
-    connectivity::OTypeInfo nPrecision
+cui/source/inc/cfgutil.hxx:132
+    SfxConfigGroupListBox m_pImageProvider
     0
-connectivity/source/inc/OTypeInfo.hxx:39
-    connectivity::OTypeInfo nMaximumScale
+include/basic/sbxvar.hxx:67
+    SbxValues::(anonymous) pData
     0
-connectivity/source/inc/OTypeInfo.hxx:40
-    connectivity::OTypeInfo nMinimumScale
+include/o3tl/vector_pool.hxx:93
+    o3tl::detail::struct_from_value::type nextFree
+    -1
+include/svtools/svparser.hxx:74
+    SvParser::TokenStackType nTokenValue
     0
-connectivity/source/inc/OTypeInfo.hxx:43
-    connectivity::OTypeInfo nSearchType
-    3
-connectivity/source/inc/OTypeInfo.hxx:44
-    connectivity::OTypeInfo nNumPrecRadix
+include/svtools/svparser.hxx:75
+    SvParser::TokenStackType bTokenHasValue
     0
-connectivity/source/inc/OTypeInfo.hxx:46
-    connectivity::OTypeInfo bCurrency
+include/vcl/field.hxx:99
+    PatternFormatter mbInPattKeyInput
     0
-connectivity/source/inc/OTypeInfo.hxx:47
-    connectivity::OTypeInfo bAutoIncrement
+include/vcl/filter/pdfdocument.hxx:173
+    vcl::filter::PDFNameElement m_nLength
     0
-connectivity/source/inc/OTypeInfo.hxx:48
-    connectivity::OTypeInfo bNullable
-    1
-connectivity/source/inc/OTypeInfo.hxx:49
-    connectivity::OTypeInfo bCaseSensitive
+include/vcl/pdfwriter.hxx:549
+    vcl::PDFWriter::PDFSignContext m_pDerEncoded
     0
-connectivity/source/inc/OTypeInfo.hxx:50
-    connectivity::OTypeInfo bUnsigned
+include/vcl/pdfwriter.hxx:551
+    vcl::PDFWriter::PDFSignContext m_nDerEncoded
     0
-include/basic/sbxvar.hxx:67
-    SbxValues::(anonymous) pData
+include/vcl/pdfwriter.hxx:553
+    vcl::PDFWriter::PDFSignContext m_pByteRange1
     0
-include/filter/msfilter/dffpropset.hxx:33
-    DffPropFlags bSet
+include/vcl/pdfwriter.hxx:555
+    vcl::PDFWriter::PDFSignContext m_nByteRange1
     0
-include/filter/msfilter/dffpropset.hxx:35
-    DffPropFlags bBlip
-    1
-include/o3tl/vector_pool.hxx:93
-    o3tl::detail::struct_from_value::type nextFree
-    -1
-include/vcl/field.hxx:100
-    PatternFormatter mbInPattKeyInput
+include/vcl/pdfwriter.hxx:557
+    vcl::PDFWriter::PDFSignContext m_pByteRange2
     0
-include/vcl/filter/pdfdocument.hxx:174
-    vcl::filter::PDFNameElement m_nLength
+include/vcl/pdfwriter.hxx:559
+    vcl::PDFWriter::PDFSignContext m_nByteRange2
     0
-libreofficekit/source/gtk/lokdocview.cxx:85
+libreofficekit/source/gtk/lokdocview.cxx:84
     LOKDocViewPrivateImpl m_bIsLoading
     0
-opencl/source/opencl_device.cxx:63
-    opencl::(anonymous namespace)::LibreOfficeDeviceEvaluationIO inputSize
+opencl/source/opencl_device.cxx:53
+    (anonymous namespace)::LibreOfficeDeviceEvaluationIO inputSize
     15360
-opencl/source/opencl_device.cxx:64
-    opencl::(anonymous namespace)::LibreOfficeDeviceEvaluationIO outputSize
+opencl/source/opencl_device.cxx:54
+    (anonymous namespace)::LibreOfficeDeviceEvaluationIO outputSize
     15360
-pyuno/source/module/pyuno_impl.hxx:314
+pyuno/source/module/pyuno_impl.hxx:312
     pyuno::RuntimeCargo valid
     1
-rsc/inc/rscdef.hxx:55
-    RscExpType cUnused
-    0
 sax/source/tools/fastserializer.hxx:231
     sax_fastparser::FastSaxSerializer mbXescape
     1
 sc/inc/compiler.hxx:108
-    ScRawToken::(anonymous union)::(anonymous) bIsInForceArray
+    ScRawToken::(anonymous union)::(anonymous) eInForceArray
     0
 sc/inc/recursionhelper.hxx:56
     ScRecursionHelper bConverging
@@ -82,6 +73,9 @@ sc/inc/recursionhelper.hxx:56
 sc/qa/unit/ucalc.hxx:41
     Test::RangeNameDef mnIndex
     1
+sc/source/ui/inc/undodat.hxx:448
+    ScUndoDataForm nEndChangeAction
+    0
 sd/inc/sdpptwrp.hxx:42
     SdPPTFilter pBas
     0
@@ -91,22 +85,22 @@ sd/source/filter/html/htmlex.hxx:114
 sd/source/ui/remotecontrol/DiscoveryService.hxx:43
     sd::DiscoveryService zService
     0
-sfx2/source/appl/lnkbase2.cxx:75
+sfx2/source/appl/lnkbase2.cxx:76
     sfx2::ImplBaseLinkData::tDDEType pItem
     0
-sfx2/source/appl/lnkbase2.cxx:80
+sfx2/source/appl/lnkbase2.cxx:81
     sfx2::ImplBaseLinkData::(anonymous) DDEType
     0
-sfx2/source/doc/doctemplates.cxx:134
+sfx2/source/doc/doctemplates.cxx:136
     (anonymous namespace)::WaitWindow_Impl mnTextStyle
     12576
-sfx2/source/view/ipclient.cxx:76
+sfx2/source/view/ipclient.cxx:78
     SfxBooleanFlagGuard m_bLifeValue
     1
 shell/source/sessioninstall/SyncDbusSessionHelper.cxx:26
     (anonymous namespace)::GErrorWrapper m_pError
     0
-soltools/cpp/cpp.h:121
+soltools/cpp/cpp.h:120
     includelist deleted
     1
 soltools/mkdepend/def.h:130
@@ -115,31 +109,31 @@ soltools/mkdepend/def.h:130
 soltools/mkdepend/def.h:132
     inclist i_searched
     1
-starmath/inc/node.hxx:101
+starmath/inc/node.hxx:104
     SmNode mnFlags
     0
-stoc/source/inspect/introspection.cxx:1537
+stoc/source/inspect/introspection.cxx:1533
     (anonymous namespace)::Cache::Data hits
     1
-sw/inc/hints.hxx:196
+sw/inc/hints.hxx:195
     SwAttrSetChg m_bDelSet
     0
 sw/inc/pagepreviewlayout.hxx:49
     SwPagePreviewLayout mnYFree
     568
-sw/source/core/inc/frmtool.hxx:256
+sw/source/core/inc/frmtool.hxx:260
     SwBorderAttrs m_bBorderDist
     1
-sw/source/core/inc/swfont.hxx:157
+sw/source/core/inc/swfont.hxx:158
     SwFont m_nToxCount
     0
-sw/source/core/inc/swfont.hxx:158
+sw/source/core/inc/swfont.hxx:159
     SwFont m_nRefCount
     0
-sw/source/core/inc/swfont.hxx:159
+sw/source/core/inc/swfont.hxx:160
     SwFont m_nMetaCount
     0
-sw/source/core/inc/swfont.hxx:160
+sw/source/core/inc/swfont.hxx:161
     SwFont m_nInputFieldCount
     0
 sw/source/core/inc/UndoSort.hxx:38
@@ -157,12 +151,15 @@ sw/source/filter/html/htmlcss1.cxx:78
 sw/source/filter/html/htmlcss1.cxx:79
     SwCSS1ItemIds nFormatKeep
     109
-sw/source/filter/html/svxcss1.hxx:205
+sw/source/filter/html/svxcss1.hxx:199
     SvxCSS1Parser nMinFixLineSpace
     141
 sw/source/filter/inc/rtf.hxx:30
     RTFSurround::(anonymous union)::(anonymous) nJunk
     0
+sw/source/filter/ww8/ww8par2.hxx:58
+    WW8SwFlyPara eAnchor
+    0
 sw/source/filter/ww8/ww8par.hxx:650
     WW8FormulaControl mfUnknown
     0
@@ -178,21 +175,18 @@ vcl/inc/salprn.hxx:42
 vcl/inc/salprn.hxx:43
     SalPrinterQueueInfo mpSysData
     0
-vcl/inc/svdata.hxx:253
+vcl/inc/svdata.hxx:267
     ImplSVNWFData mnStatusBarLowerRightOffset
     0
-vcl/inc/svdata.hxx:269
+vcl/inc/svdata.hxx:283
     ImplSVNWFData mbCenteredTabs
     0
-vcl/inc/svdata.hxx:270
+vcl/inc/svdata.hxx:284
     ImplSVNWFData mbNoActiveTabTextRaise
     0
-vcl/inc/svdata.hxx:272
+vcl/inc/svdata.hxx:286
     ImplSVNWFData mbProgressNeedsErase
     0
-vcl/inc/unx/i18n_cb.hxx:53
-    preedit_text_t nCursorPos
-    0
 vcl/source/edit/textdat2.hxx:53
     TETextPortion nWidth
     -1
@@ -208,15 +202,15 @@ vcl/source/filter/jpeg/transupp.h:129
 vcl/source/filter/jpeg/transupp.h:131
     (anonymous) crop
     0
-vcl/source/font/font.cxx:540
+vcl/source/font/font.cxx:539
     (anonymous namespace)::WeightSearchEntry weight
     5
-vcl/source/gdi/pdfwriter_impl.hxx:709
+vcl/source/gdi/pdfwriter_impl.hxx:706
     vcl::PDFWriterImpl m_nInheritedPageWidth
     595
-vcl/source/gdi/pdfwriter_impl.hxx:710
+vcl/source/gdi/pdfwriter_impl.hxx:707
     vcl::PDFWriterImpl m_nInheritedPageHeight
     842
-writerfilter/source/dmapper/GraphicImport.cxx:229
+writerfilter/source/dmapper/GraphicImport.cxx:223
     writerfilter::dmapper::GraphicImport_Impl nCurrentBorderLine
     2
diff --git a/cui/source/customize/cfgutil.cxx b/cui/source/customize/cfgutil.cxx
index 131930aa6688..e033e155b099 100644
--- a/cui/source/customize/cfgutil.cxx
+++ b/cui/source/customize/cfgutil.cxx
@@ -396,7 +396,6 @@ SfxConfigGroupListBox::SfxConfigGroupListBox(vcl::Window* pParent, WinBits nStyl
     : SvTreeListBox(pParent, nStyle)
     , xImp(new SvxConfigGroupBoxResource_Impl())
     , pFunctionListBox(nullptr)
-    , m_pImageProvider(nullptr)
     , pStylesInfo(nullptr)
 {
     SetStyle( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL | WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT );
@@ -647,16 +646,7 @@ void SfxConfigGroupListBox::FillFunctionsList(const css::uno::Sequence<DispatchI
     for (const auto & rInfo : xCommands)
     {
         OUString sUIName = MapCommand2UIName(rInfo.Command);
-        Image aImage;
-        if ( m_pImageProvider )
-            aImage = m_pImageProvider->GetImage( rInfo.Command );
-
-        SvTreeListEntry* pFuncEntry = nullptr;
-        if ( !!aImage )
-            pFuncEntry = pFunctionListBox->InsertEntry( sUIName, aImage, aImage );
-        else
-            pFuncEntry = pFunctionListBox->InsertEntry(sUIName );
-
+        SvTreeListEntry* pFuncEntry = pFunctionListBox->InsertEntry(sUIName );
         aArr.push_back( o3tl::make_unique<SfxGroupInfo_Impl>( SfxCfgKind::FUNCTION_SLOT, 0 ) );
         SfxGroupInfo_Impl* pGrpInfo = aArr.back().get();
         pGrpInfo->sCommand = rInfo.Command;
diff --git a/cui/source/inc/cfgutil.hxx b/cui/source/inc/cfgutil.hxx
index 4e7dd97cdcb7..413de4e25c83 100644
--- a/cui/source/inc/cfgutil.hxx
+++ b/cui/source/inc/cfgutil.hxx
@@ -129,7 +129,6 @@ class SfxConfigGroupListBox : public SvTreeListBox
     std::unique_ptr<SvxConfigGroupBoxResource_Impl> xImp;
     VclPtr<SfxConfigFunctionListBox>  pFunctionListBox;
     SfxGroupInfoArr_Impl            aArr;
-    SaveInData* m_pImageProvider;
     OUString m_sModuleLongName;
     css::uno::Reference< css::uno::XComponentContext > m_xContext;
     css::uno::Reference< css::frame::XFrame > m_xFrame;
diff --git a/sc/source/ui/inc/undodat.hxx b/sc/source/ui/inc/undodat.hxx
index 3b19598eb701..cb9d88135319 100644
--- a/sc/source/ui/inc/undodat.hxx
+++ b/sc/source/ui/inc/undodat.hxx
@@ -445,7 +445,6 @@ private:
     std::unique_ptr<ScRefUndoData> xRefUndoData;
     std::unique_ptr<ScRefUndoData> xRefRedoData;
     sal_uLong       nStartChangeAction;
-    sal_uLong       nEndChangeAction;
     bool            bRedoFilled;
 
     void            DoChange( const bool bUndo );
diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx
index b1bb0bbc88f3..0fd7ee5f3b68 100644
--- a/sc/source/ui/undo/undodat.cxx
+++ b/sc/source/ui/undo/undodat.cxx
@@ -1757,7 +1757,7 @@ OUString ScUndoDataForm::GetComment() const
 
 void ScUndoDataForm::SetChangeTrack()
 {
-    nStartChangeAction = nEndChangeAction = 0;
+    nStartChangeAction = 0;
 }
 
 void ScUndoDataForm::Undo()
@@ -1849,7 +1849,7 @@ void ScUndoDataForm::DoChange( const bool bUndo )
     {
         ScChangeTrack* pChangeTrack = rDoc.GetChangeTrack();
         if ( pChangeTrack )
-            pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
+            pChangeTrack->Undo( nStartChangeAction, 0 );
     }
     else
         SetChangeTrack();
diff --git a/sw/source/filter/ww8/ww8graf2.cxx b/sw/source/filter/ww8/ww8graf2.cxx
index fde01e6ad296..a2eb61857d7f 100644
--- a/sw/source/filter/ww8/ww8graf2.cxx
+++ b/sw/source/filter/ww8/ww8graf2.cxx
@@ -362,7 +362,7 @@ SwFlyFrameFormat* SwWW8ImplReader::MakeGrafNotInContent(const WW8PicDesc& rPD,
 
     WW8FlySet aFlySet(*this, m_xWFlyPara.get(), m_xSFlyPara.get(), true);
 
-    SwFormatAnchor aAnchor(m_xSFlyPara->eAnchor);
+    SwFormatAnchor aAnchor(WW8SwFlyPara::eAnchor);
     aAnchor.SetAnchor(m_pPaM->GetPoint());
     aFlySet.Put(aAnchor);
 
@@ -598,7 +598,7 @@ SwFrameFormat* SwWW8ImplReader::ImportGraf(SdrTextObj const * pTextObj,
                     {
                         WW8FlySet aFlySet(*this, m_xWFlyPara.get(), m_xSFlyPara.get(), true);
 
-                        SwFormatAnchor aAnchor(m_xSFlyPara->eAnchor);
+                        SwFormatAnchor aAnchor(WW8SwFlyPara::eAnchor);
                         aAnchor.SetAnchor(m_pPaM->GetPoint());
                         aFlySet.Put(aAnchor);
 
diff --git a/sw/source/filter/ww8/ww8par2.hxx b/sw/source/filter/ww8/ww8par2.hxx
index 11d5a37e9982..b66fc73a9aa0 100644
--- a/sw/source/filter/ww8/ww8par2.hxx
+++ b/sw/source/filter/ww8/ww8par2.hxx
@@ -55,7 +55,7 @@ struct WW8SwFlyPara
     sal_Int16 nNetWidth;
 
     SwFrameSize eHeightFix;         // height fixed or min
-    RndStdIds   eAnchor;            // binding
+    static constexpr RndStdIds eAnchor = RndStdIds::FLY_AT_PARA; // binding
     short       eHRel;              // page or page border
     short       eVRel;              // page or page border
     sal_Int16   eVAlign;            // up, down, centered
diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx
index 4eff211a0ada..d4b17f9b6f81 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -1809,7 +1809,6 @@ nWidth(rWW.nSp28),
 nHeight(rWW.nSp45),
 nNetWidth(rWW.nSp28),
 eHeightFix(ATT_FIX_SIZE),
-eAnchor(RndStdIds::FLY_AT_PARA),
 eHRel(text::RelOrientation::PAGE_FRAME),
 eVRel(text::RelOrientation::FRAME),
 eVAlign(text::VertOrientation::NONE),
@@ -2097,7 +2096,7 @@ WW8FlySet::WW8FlySet(SwWW8ImplReader& rReader, const WW8FlyPara* pFW,
 
     if( !bGraf )
     {
-        Put( SwFormatAnchor(pFS->eAnchor) );
+        Put( SwFormatAnchor(WW8SwFlyPara::eAnchor) );
         // adjust size
 
         //Ordinarily with frames, the border width and spacing is
@@ -2390,10 +2389,10 @@ bool SwWW8ImplReader::StartApo(const ApoTestResults &rApo, const WW8_TablePos *p
         }
         else
         {
-            m_xSFlyPara->pFlyFormat = m_rDoc.MakeFlySection(m_xSFlyPara->eAnchor,
+            m_xSFlyPara->pFlyFormat = m_rDoc.MakeFlySection(WW8SwFlyPara::eAnchor,
                     m_pPaM->GetPoint(), &aFlySet);
             OSL_ENSURE(m_xSFlyPara->pFlyFormat->GetAnchor().GetAnchorId() ==
-                    m_xSFlyPara->eAnchor, "Not the anchor type requested!");
+                    WW8SwFlyPara::eAnchor, "Not the anchor type requested!");
         }
 
         if (m_xSFlyPara->pFlyFormat)
@@ -2405,7 +2404,7 @@ bool SwWW8ImplReader::StartApo(const ApoTestResults &rApo, const WW8_TablePos *p
             m_xWWZOrder->InsertTextLayerObject(pOurNewObject);
         }
 
-        if (RndStdIds::FLY_AS_CHAR != m_xSFlyPara->eAnchor && m_xSFlyPara->pFlyFormat)
+        if (RndStdIds::FLY_AS_CHAR != WW8SwFlyPara::eAnchor && m_xSFlyPara->pFlyFormat)
         {
             m_xAnchorStck->AddAnchor(*m_pPaM->GetPoint(), m_xSFlyPara->pFlyFormat);
         }
commit 68f86457525c60f580954280d1a759aa174e8e96
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Fri Dec 1 15:24:30 2017 +0200

    new loplugin salcall: remove unnecessary SAL_CALL
    
    In this first commit, I use the plugin to verify the consistency of our
    SAL_CALL annotations.
    The point being to make the next commit more mechanical in nature,
    purely using the rewriter.
    
    There are various chunks of unix-only code that have never had to be
    compiled by MSVC, hence the inconsistencies.
    
    In bridges, I had to inline some typedefs to make the verification code
    happy, since it cannot see into typedefs.
    
    Change-Id: Iec6e274bed857febf7295cfcf5e9f21fe4a34da0
    Reviewed-on: https://gerrit.libreoffice.org/45502
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/bridges/inc/bridge.hxx b/bridges/inc/bridge.hxx
index bae89b4b1364..d5c3ba9d9b40 100644
--- a/bridges/inc/bridge.hxx
+++ b/bridges/inc/bridge.hxx
@@ -33,28 +33,21 @@
 namespace bridges { namespace cpp_uno { namespace shared {
 
 // private:
-extern "C" typedef void SAL_CALL FreeMapping(uno_Mapping *);
-FreeMapping freeMapping;
+extern "C" void SAL_CALL freeMapping(uno_Mapping *);
 
 // private:
-extern "C"
-typedef void SAL_CALL AcquireMapping(uno_Mapping *);
-AcquireMapping acquireMapping;
+extern "C" void SAL_CALL acquireMapping(uno_Mapping *);
 
 // private:
-extern "C"
-typedef void SAL_CALL ReleaseMapping(uno_Mapping *);
-ReleaseMapping releaseMapping;
+extern "C" void SAL_CALL releaseMapping(uno_Mapping *);
 
 // private:
-extern "C" typedef void SAL_CALL Cpp2unoMapping(
+extern "C" void SAL_CALL cpp2unoMapping(
     uno_Mapping *, void **, void *, typelib_InterfaceTypeDescription *);
-Cpp2unoMapping cpp2unoMapping;
 
 // private:
-extern "C" typedef void SAL_CALL Uno2cppMapping(
+extern "C" void SAL_CALL uno2cppMapping(
     uno_Mapping *, void **, void *, typelib_InterfaceTypeDescription *);
-Uno2cppMapping uno2cppMapping;
 
 /**
  * Holding environments and mappings.
diff --git a/bridges/inc/cppinterfaceproxy.hxx b/bridges/inc/cppinterfaceproxy.hxx
index 0b97264e42f0..dfb1bdbf1e2b 100644
--- a/bridges/inc/cppinterfaceproxy.hxx
+++ b/bridges/inc/cppinterfaceproxy.hxx
@@ -45,9 +45,8 @@ namespace bridges { namespace cpp_uno { namespace shared {
 
 class Bridge;
 
-extern "C" typedef void SAL_CALL FreeCppInterfaceProxy(
+extern "C" void SAL_CALL freeCppInterfaceProxy(
     uno_ExtEnvironment * pEnv, void * pInterface);
-FreeCppInterfaceProxy freeCppInterfaceProxy;
 
 /**
  * A cpp proxy wrapping a uno interface.
diff --git a/bridges/inc/unointerfaceproxy.hxx b/bridges/inc/unointerfaceproxy.hxx
index ba3ddcbb5624..77cd8e98a346 100644
--- a/bridges/inc/unointerfaceproxy.hxx
+++ b/bridges/inc/unointerfaceproxy.hxx
@@ -39,25 +39,21 @@ namespace bridges { namespace cpp_uno { namespace shared {
 
 class Bridge;
 
-extern "C" typedef void SAL_CALL FreeUnoInterfaceProxy(
+extern "C" void SAL_CALL freeUnoInterfaceProxy(
     uno_ExtEnvironment * pEnv, void * pProxy);
-FreeUnoInterfaceProxy freeUnoInterfaceProxy;
 
 // private:
-extern "C" typedef void SAL_CALL UnoInterfaceProxyDispatch(
+extern "C" void SAL_CALL unoInterfaceProxyDispatch(
     uno_Interface * pUnoI, typelib_TypeDescription const * pMemberDescr,
     void * pReturn, void * pArgs[], uno_Any ** ppException);
-UnoInterfaceProxyDispatch unoInterfaceProxyDispatch;
     // this function is not defined in the generic part, but instead has to be
     // defined individually for each CPP--UNO bridge
 
 // private:
-extern "C" typedef void SAL_CALL AcquireProxy(uno_Interface *);
-AcquireProxy acquireProxy;
+extern "C" void SAL_CALL acquireProxy(uno_Interface *);
 
 // private:
-extern "C" typedef void SAL_CALL ReleaseProxy(uno_Interface *);
-ReleaseProxy releaseProxy;
+extern "C" void SAL_CALL releaseProxy(uno_Interface *);
 
 /**
  * A uno proxy wrapping a cpp interface.
diff --git a/compilerplugins/clang/salcall.cxx b/compilerplugins/clang/salcall.cxx
new file mode 100644
index 000000000000..f982d7f41b11
--- /dev/null
+++ b/compilerplugins/clang/salcall.cxx
@@ -0,0 +1,370 @@
+/* -*- 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 <fstream>
+
+// The SAL_CALL function annotation is only necessary on our outward
+// facing C++ ABI, anywhere else it is just cargo-cult.
+//
+
+namespace
+{
+//static bool startswith(const std::string& rStr, const char* pSubStr)
+//{
+//    return rStr.compare(0, strlen(pSubStr), pSubStr) == 0;
+//}
+
+class SalCall final : public RecursiveASTVisitor<SalCall>, public loplugin::RewritePlugin
+{
+public:
+    explicit SalCall(loplugin::InstantiationData const& data)
+        : RewritePlugin(data)
+    {
+    }
+
+    virtual void run() override
+    {
+        std::string fn(compiler.getSourceManager()
+                           .getFileEntryForID(compiler.getSourceManager().getMainFileID())
+                           ->getName());
+        loplugin::normalizeDotDotInFilePath(fn);
+        // ignore this one. I can't get accurate source code from getCharacterData() for it.
+        if (fn == SRCDIR "/sal/rtl/string.cxx")
+            return;
+        m_phase = PluginPhase::FindAddressOf;
+        TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+        m_phase = PluginPhase::Warning;
+        TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+    }
+
+    bool VisitFunctionDecl(FunctionDecl const*);
+    bool VisitUnaryAddrOf(UnaryOperator const*);
+    bool VisitInitListExpr(InitListExpr const*);
+    bool VisitCallExpr(CallExpr const*);
+    bool VisitBinAssign(BinaryOperator const*);
+    bool VisitCXXConstructExpr(CXXConstructExpr const*);
+
+private:
+    void checkForFunctionDecl(Expr const*, bool bCheckOnly = false);
+    bool rewrite(SourceLocation);
+    bool checkOverlap(SourceRange);
+    bool isSalCallFunction(FunctionDecl const* functionDecl, SourceLocation* pLoc = nullptr);
+
+    std::set<FunctionDecl const*> m_addressOfSet;
+    enum class PluginPhase
+    {
+        FindAddressOf,
+        Warning
+    };
+    PluginPhase m_phase;
+    std::vector<std::pair<char const*, char const*>> mvModifiedRanges;
+};
+
+bool SalCall::VisitUnaryAddrOf(UnaryOperator const* op)
+{
+    if (m_phase != PluginPhase::FindAddressOf)
+        return true;
+    checkForFunctionDecl(op->getSubExpr());
+    return true;
+}
+
+bool SalCall::VisitBinAssign(BinaryOperator const* binaryOperator)
+{
+    if (m_phase != PluginPhase::FindAddressOf)
+        return true;
+    checkForFunctionDecl(binaryOperator->getRHS());
+    return true;
+}
+
+bool SalCall::VisitCallExpr(CallExpr const* callExpr)
+{
+    if (m_phase != PluginPhase::FindAddressOf)
+        return true;
+    for (auto arg : callExpr->arguments())
+        checkForFunctionDecl(arg);
+    return true;
+}
+
+bool SalCall::VisitCXXConstructExpr(CXXConstructExpr const* constructExpr)
+{
+    if (m_phase != PluginPhase::FindAddressOf)
+        return true;
+    for (auto arg : constructExpr->arguments())
+        checkForFunctionDecl(arg);
+    return true;
+}
+
+bool SalCall::VisitInitListExpr(InitListExpr const* initListExpr)
+{
+    if (m_phase != PluginPhase::FindAddressOf)
+        return true;
+    for (auto subStmt : *initListExpr)
+        checkForFunctionDecl(dyn_cast<Expr>(subStmt));
+    return true;
+}
+
+void SalCall::checkForFunctionDecl(Expr const* expr, bool bCheckOnly)
+{
+    auto e1 = expr->IgnoreParenCasts();
+    auto declRef = dyn_cast<DeclRefExpr>(e1);
+    if (!declRef)
+        return;
+    auto functionDecl = dyn_cast<FunctionDecl>(declRef->getDecl());
+    if (!functionDecl)
+        return;
+    if (bCheckOnly)
+        getParentStmt(expr)->dump();
+    else
+        m_addressOfSet.insert(functionDecl->getCanonicalDecl());
+}
+
+bool SalCall::VisitFunctionDecl(FunctionDecl const* decl)
+{
+    if (m_phase != PluginPhase::Warning)
+        return true;
+    if (ignoreLocation(decl))
+        return true;
+
+    // ignore template stuff
+    if (decl->getTemplatedKind() != clang::FunctionDecl::TK_NonTemplate)
+        return true;
+    auto recordDecl = dyn_cast<CXXRecordDecl>(decl->getDeclContext());
+    if (recordDecl
+        && (recordDecl->getTemplateSpecializationKind() != TSK_Undeclared
+            || recordDecl->isDependentContext()))
+    {
+        return true;
+    }
+
+    auto canonicalDecl = decl->getCanonicalDecl();
+
+    // ignore UNO implementations
+    if (isInUnoIncludeFile(
+            compiler.getSourceManager().getSpellingLoc(canonicalDecl->getLocation())))
+        return true;
+
+    // macros make getCharacterData() extremely unreliable
+    if (compiler.getSourceManager().isMacroArgExpansion(decl->getLocation())
+        || compiler.getSourceManager().isMacroBodyExpansion(decl->getLocation()))
+        return true;
+
+    SourceLocation rewriteLoc;
+    SourceLocation rewriteCanonicalLoc;
+    bool bDeclIsSalCall = isSalCallFunction(decl, &rewriteLoc);
+    bool bCanonicalDeclIsSalCall = isSalCallFunction(canonicalDecl, &rewriteCanonicalLoc);
+
+    // first, check for consistency, so we don't trip ourselves up on Linux, where we normally run the plugin
+    if (canonicalDecl != decl)
+    {
+        if (bCanonicalDeclIsSalCall)
+            ; // this is fine, the actual definition have or not have SAL_CALL, and MSVC is fine with it
+        else if (bDeclIsSalCall)
+        {
+            // not fine
+            report(DiagnosticsEngine::Warning, "SAL_CALL inconsistency",
+                   canonicalDecl->getLocation())
+                << canonicalDecl->getSourceRange();
+            report(DiagnosticsEngine::Note, "SAL_CALL inconsistency", decl->getLocation())
+                << decl->getSourceRange();
+            return true;
+        }
+    }
+    auto methodDecl = dyn_cast<CXXMethodDecl>(canonicalDecl);
+    if (methodDecl)
+    {
+        for (auto iter = methodDecl->begin_overridden_methods();
+             iter != methodDecl->end_overridden_methods(); ++iter)
+        {
+            const CXXMethodDecl* overriddenMethod = (*iter)->getCanonicalDecl();
+            if (bCanonicalDeclIsSalCall != isSalCallFunction(overriddenMethod))
+            {
+                report(DiagnosticsEngine::Warning, "SAL_CALL inconsistency",
+                       methodDecl->getLocation())
+                    << methodDecl->getSourceRange();
+                report(DiagnosticsEngine::Note, "SAL_CALL inconsistency",
+                       overriddenMethod->getLocation())
+                    << overriddenMethod->getSourceRange();
+                return true;
+            }
+        }
+    }
+
+    if (!bDeclIsSalCall)
+        return true;
+
+    // @TODO For now, I am ignore free functions, since those are most likely to have their address taken.
+    // I'll do these later. They are harder to verify since MSVC does not verify when assigning to function pointers
+    // that the calling convention of the function matches the calling convention of the function pointer!
+    if (!methodDecl || methodDecl->isStatic())
+        return true;
+
+    // can only check when we have a definition since this is the most likely time
+    // when the address of the method will be taken
+    if (!(methodDecl && methodDecl->isPure()) && !decl->isThisDeclarationADefinition())
+        return true;
+    if (m_addressOfSet.find(decl->getCanonicalDecl()) != m_addressOfSet.end())
+        return true;
+
+    // ignore extern "C" UNO factory constructor functions
+    if (decl->isExternC())
+    {
+        if (loplugin::TypeCheck(decl->getReturnType())
+                .Pointer()
+                .Class("XInterface")
+                .Namespace("uno")
+                .Namespace("star")
+                .Namespace("sun")
+                .Namespace("com")
+                .GlobalNamespace())
+            return true;
+        if (loplugin::TypeCheck(decl->getReturnType()).Pointer().Void())
+            return true;
+    }
+
+    // some base classes are overridden by sub-classes which override both the base-class and an UNO class
+    if (recordDecl)
+    {
+        if (loplugin::DeclCheck(recordDecl)
+                .Class("OProxyAggregation")
+                .Namespace("comphelper")
+                .GlobalNamespace()
+            || loplugin::DeclCheck(recordDecl)
+                   .Class("OComponentProxyAggregationHelper")
+                   .Namespace("comphelper")
+                   .GlobalNamespace()
+            || loplugin::DeclCheck(recordDecl).Class("SvxShapeMaster").GlobalNamespace())
+            return true;
+    }
+
+    if (methodDecl)
+    {
+        for (auto iter = methodDecl->begin_overridden_methods();
+             iter != methodDecl->end_overridden_methods(); ++iter)
+        {
+            const CXXMethodDecl* overriddenMethod = (*iter)->getCanonicalDecl();
+            if (isSalCallFunction(overriddenMethod))
+                return true;
+        }
+    }
+
+    /*
+    bool bOK = rewrite(rewriteLoc);
+    if (bOK && canonicalDecl != decl)
+    {
+        bOK = rewrite(rewriteCanonicalLoc);
+    }
+    if (bOK)
+        return true;
+
+    //std::cout << "xxx:" << std::string(p1, leftBracket - p1) << std::endl;
+    report(DiagnosticsEngine::Warning, "SAL_CALL unnecessary here", rewriteLoc)
+        << decl->getSourceRange();
+    if (canonicalDecl != decl)
+        report(DiagnosticsEngine::Warning, "SAL_CALL unnecessary here", rewriteCanonicalLoc)
+            << canonicalDecl->getSourceRange();
+*/
+    return true;
+}
+
+bool SalCall::isSalCallFunction(FunctionDecl const* functionDecl, SourceLocation* pLoc)
+{
+    // In certain situations, in header files, clang will return bogus range data
+    // from decl->getSourceRange().
+    // Specifically, for the
+    //     LNG_DLLPUBLIC CapType SAL_CALL capitalType(const OUString&, CharClass const *);
+    // declaration in
+    //     include/linguistic/misc.hxx
+    // it looks like it is returning data from definition of the LNG_DLLPUBLIC macro.
+    // I suspect something inside clang is calling getSpellingLoc() once too often.
+    //
+    // So I use getReturnTypeSourceRange() for the start of the range
+    // instead, and search for the "(" in the function decl.
+
+    SourceRange range = functionDecl->getSourceRange();
+    SourceManager& SM = compiler.getSourceManager();
+    SourceLocation startLoc = functionDecl->getReturnTypeSourceRange().getBegin();
+    SourceLocation endLoc = range.getEnd();
+    if (!startLoc.isValid() || !endLoc.isValid())
+        return false;
+    char const* p1 = SM.getCharacterData(startLoc);
+    char const* p2 = SM.getCharacterData(endLoc);
+
+    //    if (functionDecl->getIdentifier() && functionDecl->getName() == "capitalType")
+    //    {
+    //        std::cout << "xxxx " << (long)p1 << " " << (long)p2 << " " << (int)(p2-p1) << std::endl;
+    //        std::cout << "  " << std::string(p1, 80) << std::endl;
+    //        report(DiagnosticsEngine::Warning, "jhjkahdashdkash", functionDecl->getLocation())
+    //            << functionDecl->getSourceRange();
+    //    }
+    //
+    static const char* SAL_CALL = "SAL_CALL";
+
+    char const* leftBracket = static_cast<char const*>(memchr(p1, '(', p2 - p1));
+    if (!leftBracket)
+        return false;
+
+    char const* found = std::search(p1, leftBracket, SAL_CALL, SAL_CALL + strlen(SAL_CALL));
+
+    if (found >= leftBracket)
+        return false;
+
+    if (pLoc)
+        // the -1 is to remove the space before the SAL_CALL
+        *pLoc = startLoc.getLocWithOffset(found - p1 - 1);
+
+    return true;
+}
+
+bool SalCall::rewrite(SourceLocation locBegin)
+{
+    if (!rewriter)
+        return false;
+
+    auto locEnd = locBegin.getLocWithOffset(8);
+
+    SourceRange range(locBegin, locEnd);
+
+    // If we overlap with a previous area we modified, we cannot perform this change
+    // without corrupting the source
+    if (!checkOverlap(range))
+        return false;
+
+    if (!replaceText(locBegin, 9, ""))
+        return false;
+
+    return true;
+}
+
+// If we overlap with a previous area we modified, we cannot perform this change
+// without corrupting the source
+bool SalCall::checkOverlap(SourceRange range)
+{
+    SourceManager& SM = compiler.getSourceManager();
+    char const* p1 = SM.getCharacterData(range.getBegin());
+    char const* p2 = SM.getCharacterData(range.getEnd());
+    for (std::pair<char const*, char const*> const& rPair : mvModifiedRanges)
+    {
+        if (rPair.first <= p1 && p1 <= rPair.second)
+            return false;
+        if (p1 <= rPair.second && rPair.first <= p2)
+            return false;
+    }
+    mvModifiedRanges.emplace_back(p1, p2);
+    return true;
+}
+
+static loplugin::Plugin::Registration<SalCall> reg("salcall", true);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/compilerplugins/clang/test/salcall.cxx b/compilerplugins/clang/test/salcall.cxx
new file mode 100644
index 000000000000..3b05530e8097
--- /dev/null
+++ b/compilerplugins/clang/test/salcall.cxx
@@ -0,0 +1,104 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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 <sal/types.h>
+
+class Class1
+{
+    void SAL_CALL method1(); // xxexpected-error {{SAL_CALL unnecessary here [loplugin:salcall]}}
+};
+void SAL_CALL Class1::method1() {
+} // xxexpected-error {{SAL_CALL unnecessary here [loplugin:salcall]}}
+
+class Class2
+{
+    void method1(); // expected-error {{SAL_CALL inconsistency [loplugin:salcall]}}
+};
+void SAL_CALL Class2::method1() {} // expected-note {{SAL_CALL inconsistency [loplugin:salcall]}}
+
+// no warning, this appears to be legal
+class Class3
+{
+    void SAL_CALL method1();
+};
+void Class3::method1() {}
+
+// no warning, normal case for reference
+class Class4
+{
+    void method1();
+};
+void Class4::method1() {}
+
+class Class5_1
+{
+    virtual void method1(); // expected-note {{SAL_CALL inconsistency [loplugin:salcall]}}
+    virtual ~Class5_1();
+};
+class Class5_2
+{
+    virtual void SAL_CALL method1();
+    virtual ~Class5_2();
+};
+class Class5_3 : public Class5_1, public Class5_2
+{
+    virtual void SAL_CALL
+    method1() override; // expected-error {{SAL_CALL inconsistency [loplugin:salcall]}}
+    virtual ~Class5_3();
+};
+
+class Class6_1
+{
+    virtual void SAL_CALL method1();
+    virtual ~Class6_1();
+};
+class Class6_2
+{
+    virtual void SAL_CALL method1();
+    virtual ~Class6_2();
+};
+class Class6_3 : public Class6_1, public Class6_2
+{
+    virtual void SAL_CALL method1() override;
+    virtual ~Class6_3();
+};
+
+class Class7_1
+{
+    virtual void method1();
+    virtual ~Class7_1();
+};
+class Class7_2
+{
+    virtual void method1();
+    virtual ~Class7_2();
+};
+class Class7_3 : public Class7_1, public Class7_2
+{
+    virtual void method1() override;
+    virtual ~Class7_3();
+};
+
+class Class8_1
+{
+    virtual void method2();
+    virtual ~Class8_1();
+};
+class Class8_2
+{
+    virtual void SAL_CALL method2(); // expected-note {{SAL_CALL inconsistency [loplugin:salcall]}}
+    virtual ~Class8_2();
+};
+class Class8_3 : public Class8_1, public Class8_2
+{
+    virtual void method2() override; // expected-error {{SAL_CALL inconsistency [loplugin:salcall]}}
+    virtual ~Class8_3();
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/connectivity/source/drivers/odbc/ORealDriver.hxx b/connectivity/source/drivers/odbc/ORealDriver.hxx
index b4b092b87697..5a103d80fec3 100644
--- a/connectivity/source/drivers/odbc/ORealDriver.hxx
+++ b/connectivity/source/drivers/odbc/ORealDriver.hxx
@@ -33,7 +33,7 @@ namespace com { namespace sun { namespace star {
 namespace connectivity { namespace odbc {
 
 /// @throws css::uno::Exception
-css::uno::Reference< css::uno::XInterface >
+css::uno::Reference< css::uno::XInterface > SAL_CALL
 ODBCDriver_CreateInstance( css::uno::Reference< css::lang::XMultiServiceFactory > const & factory);
 
 } }
diff --git a/desktop/source/deployment/inc/dp_registry.hxx b/desktop/source/deployment/inc/dp_registry.hxx
index 43746ddfc642..7a3eda34f08a 100644
--- a/desktop/source/deployment/inc/dp_registry.hxx
+++ b/desktop/source/deployment/inc/dp_registry.hxx
@@ -32,7 +32,7 @@ namespace com { namespace sun { namespace star {
 
 namespace dp_registry {
 
-css::uno::Reference<css::deployment::XPackageRegistry> create(
+css::uno::Reference<css::deployment::XPackageRegistry> SAL_CALL create(
     OUString const & context, OUString const & cachePath,
     css::uno::Reference<css::uno::XComponentContext> const & xComponentContext);
 
diff --git a/extensions/source/propctrlr/eventhandler.hxx b/extensions/source/propctrlr/eventhandler.hxx
index bf6582623dd1..57274d235d75 100644
--- a/extensions/source/propctrlr/eventhandler.hxx
+++ b/extensions/source/propctrlr/eventhandler.hxx
@@ -100,7 +100,7 @@ namespace pcr
         static OUString SAL_CALL getImplementationName_static(  );
         /// @throws css::uno::RuntimeException
         static css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames_static(  );
-        static css::uno::Reference< css::uno::XInterface > Create( const css::uno::Reference< css::uno::XComponentContext >& _rxContext );
+        static css::uno::Reference< css::uno::XInterface > SAL_CALL Create( const css::uno::Reference< css::uno::XComponentContext >& _rxContext );
 
     private:
         explicit EventHandler(
diff --git a/extensions/source/propctrlr/genericpropertyhandler.hxx b/extensions/source/propctrlr/genericpropertyhandler.hxx
index c85732fc412d..51ac2f61e1a2 100644
--- a/extensions/source/propctrlr/genericpropertyhandler.hxx
+++ b/extensions/source/propctrlr/genericpropertyhandler.hxx
@@ -83,7 +83,7 @@ namespace pcr
         static OUString SAL_CALL getImplementationName_static(  );
         /// @throws css::uno::RuntimeException
         static css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames_static(  );
-        static css::uno::Reference< css::uno::XInterface > Create( const css::uno::Reference< css::uno::XComponentContext >& _rxContext );
+        static css::uno::Reference< css::uno::XInterface > SAL_CALL Create( const css::uno::Reference< css::uno::XComponentContext >& _rxContext );
 
     private:
         explicit GenericPropertyHandler(
diff --git a/extensions/source/scanner/scanunx.cxx b/extensions/source/scanner/scanunx.cxx
index 8d38481ba1d9..45015ef127f1 100644
--- a/extensions/source/scanner/scanunx.cxx
+++ b/extensions/source/scanner/scanunx.cxx
@@ -129,8 +129,8 @@ class ScannerThread : public osl::Thread
     ScannerManager*                           m_pManager; // just for the disposing call
 
 public:
-    virtual void run() override;
-    virtual void onTerminated() override { delete this; }
+    virtual void SAL_CALL run() override;
+    virtual void SAL_CALL onTerminated() override { delete this; }
 public:
     ScannerThread( const std::shared_ptr<SaneHolder>& pHolder,
                    const Reference< css::lang::XEventListener >& listener,
diff --git a/filter/source/config/cache/contenthandlerfactory.hxx b/filter/source/config/cache/contenthandlerfactory.hxx
index f684b4048667..82bf415810cc 100644
--- a/filter/source/config/cache/contenthandlerfactory.hxx
+++ b/filter/source/config/cache/contenthandlerfactory.hxx
@@ -113,7 +113,7 @@ class ContentHandlerFactory : public ::cppu::ImplInheritanceHelper< BaseContaine
 
             @return The new instance of this service as an uno reference.
          */
-        static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+        static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
 
 
       // Overrides to resolve ambiguity
diff --git a/filter/source/config/cache/filterfactory.hxx b/filter/source/config/cache/filterfactory.hxx
index c0e9a34d5aa3..bf211ac102d9 100644
--- a/filter/source/config/cache/filterfactory.hxx
+++ b/filter/source/config/cache/filterfactory.hxx
@@ -171,7 +171,7 @@ class FilterFactory : public ::cppu::ImplInheritanceHelper< BaseContainer
 
             @return The new instance of this service as an uno reference.
          */
-        static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+        static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
 };
 
     } // namespace config
diff --git a/filter/source/config/cache/frameloaderfactory.hxx b/filter/source/config/cache/frameloaderfactory.hxx
index 7dab5e02b0d9..bf05fc920af3 100644
--- a/filter/source/config/cache/frameloaderfactory.hxx
+++ b/filter/source/config/cache/frameloaderfactory.hxx
@@ -113,7 +113,7 @@ class FrameLoaderFactory : public ::cppu::ImplInheritanceHelper< BaseContainer
 
             @return The new instance of this service as an uno reference.
          */
-        static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+        static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
 
       // Overrides to resolve ambiguity
       virtual css::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) override
diff --git a/filter/source/config/cache/typedetection.hxx b/filter/source/config/cache/typedetection.hxx
index 830badc54f63..78f8964e66ea 100644
--- a/filter/source/config/cache/typedetection.hxx
+++ b/filter/source/config/cache/typedetection.hxx
@@ -368,7 +368,7 @@ public:
 
         @return The new instance of this service as an uno reference.
      */
-    static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
+    static css::uno::Reference< css::uno::XInterface > SAL_CALL impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
 };
 
 class TerminateDetection : public cppu::WeakComponentImplHelper<css::frame::XTerminateListener>
diff --git a/filter/source/odfflatxml/OdfFlatXml.cxx b/filter/source/odfflatxml/OdfFlatXml.cxx
index 381e8429e612..aab5ec7adec4 100644
--- a/filter/source/odfflatxml/OdfFlatXml.cxx
+++ b/filter/source/odfflatxml/OdfFlatXml.cxx
@@ -97,7 +97,7 @@ namespace filter {
 
             static Sequence< OUString > impl_getSupportedServiceNames();
 
-            static Reference< XInterface > impl_createInstance(const Reference< XMultiServiceFactory >& fact);
+            static Reference< XInterface > SAL_CALL impl_createInstance(const Reference< XMultiServiceFactory >& fact);
         };
     }
 }
diff --git a/forms/source/xforms/binding.hxx b/forms/source/xforms/binding.hxx
index dc6ba779bbc4..1bd019a7d497 100644
--- a/forms/source/xforms/binding.hxx
+++ b/forms/source/xforms/binding.hxx
@@ -258,7 +258,7 @@ public:
 
     // the ID for XUnoTunnel calls
     static css::uno::Sequence<sal_Int8> getUnoTunnelID();
-    static Binding* getBinding( const css::uno::Reference<css::beans::XPropertySet>& );
+    static Binding* SAL_CALL getBinding( const css::uno::Reference<css::beans::XPropertySet>& );
 
 
 private:
diff --git a/idlc/source/idlcproduce.cxx b/idlc/source/idlcproduce.cxx
index 60c5ff463045..2fa0a3b0317b 100644
--- a/idlc/source/idlcproduce.cxx
+++ b/idlc/source/idlcproduce.cxx
@@ -121,7 +121,7 @@ void removeIfExists(const OString& pathname)
     osl::File::remove(OStringToOUString(pathname, RTL_TEXTENCODING_UTF8));
 }
 
-sal_Int32 SAL_CALL
+sal_Int32
 produceFile(const OString& regFileName, sPair_t const*const pDepFile)
 {
     Options* pOptions = idlc()->getOptions();
diff --git a/include/formula/FormulaOpCodeMapperObj.hxx b/include/formula/FormulaOpCodeMapperObj.hxx
index 36099199e60a..0d3c94330f45 100644
--- a/include/formula/FormulaOpCodeMapperObj.hxx
+++ b/include/formula/FormulaOpCodeMapperObj.hxx
@@ -52,9 +52,9 @@ class FORMULA_DLLPUBLIC FormulaOpCodeMapperObj : public cppu::WeakImplHelper<
 {
     ::std::unique_ptr<FormulaCompiler> m_pCompiler;
 public:
-    static OUString  getImplementationName_Static();
-    static css::uno::Sequence< OUString> getSupportedServiceNames_Static();
-    static css::uno::Reference< css::uno::XInterface > create(const css::uno::Reference< css::uno::XComponentContext >& _xContext);
+    static OUString  SAL_CALL getImplementationName_Static();
+    static css::uno::Sequence< OUString> SAL_CALL getSupportedServiceNames_Static();
+    static css::uno::Reference< css::uno::XInterface > SAL_CALL create(const css::uno::Reference< css::uno::XComponentContext >& _xContext);
 
 protected:
                             FormulaOpCodeMapperObj(::std::unique_ptr<FormulaCompiler> && _pCompiler);
diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx
index 68d384414af3..86d513a73225 100644
--- a/sal/osl/unx/file.cxx
+++ b/sal/osl/unx/file.cxx
@@ -1056,7 +1056,7 @@ oslFileError SAL_CALL osl_openFile(rtl_uString* ustrFileURL, oslFileHandle* pHan
     return openFile(ustrFileURL, pHandle, uFlags, mode_t(-1));
 }
 
-oslFileError SAL_CALL openFile(rtl_uString* ustrFileURL, oslFileHandle* pHandle, sal_uInt32 uFlags, mode_t mode)
+oslFileError openFile(rtl_uString* ustrFileURL, oslFileHandle* pHandle, sal_uInt32 uFlags, mode_t mode)
 {
     oslFileError eRet;
 
diff --git a/sd/source/ui/inc/facreg.hxx b/sd/source/ui/inc/facreg.hxx
index a235e393818c..58a4903a731b 100644
--- a/sd/source/ui/inc/facreg.hxx
+++ b/sd/source/ui/inc/facreg.hxx
@@ -30,13 +30,13 @@ namespace com { namespace sun { namespace star {
 
 css::uno::Reference< css::uno::XInterface > SAL_CALL SdDrawingDocument_createInstance( const css::uno::Reference< css::lang::XMultiServiceFactory > & _rxFactory, SfxModelFlags _nCreationFlags );
 /// @throws css::uno::RuntimeException
-OUString SdDrawingDocument_getImplementationName();
+OUString SAL_CALL SdDrawingDocument_getImplementationName();
 /// @throws css::uno::RuntimeException
 css::uno::Sequence< OUString > SAL_CALL SdDrawingDocument_getSupportedServiceNames();
 
 css::uno::Reference< css::uno::XInterface > SAL_CALL SdPresentationDocument_createInstance( const css::uno::Reference< css::lang::XMultiServiceFactory > & _rxFactory, SfxModelFlags _nCreationFlags );
 /// @throws css::uno::RuntimeException
-OUString SdPresentationDocument_getImplementationName();
+OUString SAL_CALL SdPresentationDocument_getImplementationName();
 /// @throws css::uno::RuntimeException
 css::uno::Sequence< OUString > SAL_CALL SdPresentationDocument_getSupportedServiceNames();
 
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk
index c2b78bf8832d..4a98ef996091 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -38,6 +38,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
     compilerplugins/clang/test/redundantpointerops \
     compilerplugins/clang/test/refcounting \
     compilerplugins/clang/test/salbool \
+    compilerplugins/clang/test/salcall \
     compilerplugins/clang/test/salunicodeliteral \
     compilerplugins/clang/test/simplifybool \
     compilerplugins/clang/test/simplifydynamiccast \
diff --git a/svtools/source/uno/fpicker.hxx b/svtools/source/uno/fpicker.hxx
index 5042cffe0431..516c56ec667d 100644
--- a/svtools/source/uno/fpicker.hxx
+++ b/svtools/source/uno/fpicker.hxx
@@ -35,12 +35,12 @@ namespace com { namespace sun { namespace star {
 css::uno::Reference<css::uno::XInterface> SAL_CALL FilePicker_CreateInstance(
         css::uno::Reference< css::uno::XComponentContext > const & context);
 css::uno::Sequence<OUString> FilePicker_getSupportedServiceNames();
-OUString FilePicker_getImplementationName();
+OUString SAL_CALL FilePicker_getImplementationName();
 
 css::uno::Reference<css::uno::XInterface> SAL_CALL FolderPicker_CreateInstance(
         css::uno::Reference< css::uno::XComponentContext > const & context);
 css::uno::Sequence<OUString> FolderPicker_getSupportedServiceNames();
-OUString FolderPicker_getImplementationName();
+OUString SAL_CALL FolderPicker_getImplementationName();
 
 #endif
 
diff --git a/vcl/unx/generic/printer/printerinfomanager.cxx b/vcl/unx/generic/printer/printerinfomanager.cxx
index f19a45bc2aa0..9a6c7907cd5f 100644
--- a/vcl/unx/generic/printer/printerinfomanager.cxx
+++ b/vcl/unx/generic/printer/printerinfomanager.cxx
@@ -60,7 +60,7 @@ namespace psp
                                     m_aQueues;
         OUString                    m_aCommand;
 
-        virtual void run() override;
+        virtual void SAL_CALL run() override;
 
         public:
         SystemQueueInfo();
diff --git a/vcl/unx/gtk/a11y/atklistener.hxx b/vcl/unx/gtk/a11y/atklistener.hxx
index 82baf1e72461..58798d4439fb 100644
--- a/vcl/unx/gtk/a11y/atklistener.hxx
+++ b/vcl/unx/gtk/a11y/atklistener.hxx
@@ -33,10 +33,10 @@ public:
     explicit AtkListener(AtkObjectWrapper * pWrapper);
 
     // XEventListener
-    virtual void disposing( const css::lang::EventObject& Source ) override;
+    virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override;
 
     // XAccessibleEventListener
-    virtual void notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override;
+    virtual void SAL_CALL notifyEvent( const css::accessibility::AccessibleEventObject& aEvent ) override;
 
 private:
 
diff --git a/vcl/unx/gtk/a11y/atkutil.cxx b/vcl/unx/gtk/a11y/atkutil.cxx
index 14bb6045c376..5b7e89bd78af 100644
--- a/vcl/unx/gtk/a11y/atkutil.cxx
+++ b/vcl/unx/gtk/a11y/atkutil.cxx
@@ -185,10 +185,10 @@ public:
     static uno::Reference< accessibility::XAccessible > getAccessible(const lang::EventObject& aEvent );
 
     // XEventListener
-    virtual void disposing( const lang::EventObject& Source ) override;
+    virtual void SAL_CALL disposing( const lang::EventObject& Source ) override;
 
     // XAccessibleEventListener
-    virtual void notifyEvent( const accessibility::AccessibleEventObject& aEvent ) override;
+    virtual void SAL_CALL notifyEvent( const accessibility::AccessibleEventObject& aEvent ) override;
 };
 
 /*****************************************************************************/
diff --git a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx
index 8f22a8f37363..d8868884e99a 100644
--- a/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx
+++ b/xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx
@@ -81,7 +81,7 @@ class X509Certificate_NssImpl : public ::cppu::WeakImplHelper<
         virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier ) override;
 
         /// @see xmlsecurity::Certificate::getSHA256Thumbprint().
-        virtual css::uno::Sequence<sal_Int8> getSHA256Thumbprint() override;
+        virtual css::uno::Sequence<sal_Int8> SAL_CALL getSHA256Thumbprint() override;
 
         static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId() ;
 
diff --git a/xmlsecurity/source/xmlsec/xsec_xmlsec.hxx b/xmlsecurity/source/xmlsec/xsec_xmlsec.hxx
index 5ecdf4e9de68..7db284869e56 100644
--- a/xmlsecurity/source/xmlsec/xsec_xmlsec.hxx
+++ b/xmlsecurity/source/xmlsec/xsec_xmlsec.hxx
@@ -24,7 +24,7 @@
 
 extern "C" {
 
-void* nss_component_getFactory( const sal_Char*, void*, void* );
+void* SAL_CALL nss_component_getFactory( const sal_Char*, void*, void* );
 
 #if defined( XMLSEC_CRYPTO_MSCRYPTO )
 void* mscrypt_component_getFactory( const sal_Char*, void*, void* );


More information about the Libreoffice-commits mailing list