compilerplugins/clang/test/xmlimport.cxx             |   32 +++++++
 compilerplugins/clang/xmlimport.cxx                  |   81 +++++++++++++++++++
 dbaccess/source/ui/dlg/dbwizsetup.cxx                |    6 -
 drawinglayer/source/tools/emfpfont.cxx               |   11 +-
 drawinglayer/source/tools/emfphelperdata.cxx         |    8 -
 drawinglayer/source/tools/emfppen.cxx                |   31 +++----
 drawinglayer/source/tools/emfpstringformat.cxx       |   43 +++++-----
 emfio/source/reader/emfreader.cxx                    |    2 
 extensions/source/ole/oleobjw.cxx                    |    2 
 filter/source/msfilter/mstoolbar.cxx                 |    2 
 include/rtl/string.hxx                               |    2 
 include/rtl/ustring.hxx                              |    2 
 l10ntools/source/localize.cxx                        |    6 -
 oox/source/vml/vmldrawing.cxx                        |    2 
 sal/qa/osl/file/osl_File.cxx                         |   24 ++---
 sc/source/filter/excel/xestream.cxx                  |    2 
 sc/source/ui/vba/vbaeventshelper.cxx                 |    8 -
 scripting/source/dlgprov/dlgevtatt.cxx               |    2 
 scripting/source/protocolhandler/scripthandler.cxx   |    5 -
 scripting/source/provider/URIHelper.cxx              |    4 
 scripting/source/vbaevents/eventhelper.cxx           |    3 
 sd/qa/unit/tiledrendering/tiledrendering.cxx         |    2 
 sdext/source/minimizer/informationdialog.cxx         |    2 
 sdext/source/minimizer/optimizerdialogcontrols.cxx   |    2 
 sw/qa/extras/tiledrendering/tiledrendering.cxx       |    2 
 sw/source/ui/vba/vbaoptions.cxx                      |    2 
 unodevtools/source/skeletonmaker/cppcompskeleton.cxx |    2 
 vbahelper/source/msforms/vbauserform.cxx             |    2 
 xmloff/source/text/txtfldi.cxx                       |    2 
 29 files changed, 204 insertions(+), 90 deletions(-)

New commits:
commit cc1e6ee2dd4609c27cb7a09aa47a779592a3e22c
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Tue Nov 10 14:41:56 2020 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Nov 11 06:33:40 2020 +0100

    disable O(U)String::concat for internal code
    
    in favour of the more widely used, and better optimised, operator+
    
    Change-Id: I6a1b37e0f3d253af1f7a0892443f59b620efea63
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105523
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/dbaccess/source/ui/dlg/dbwizsetup.cxx 
b/dbaccess/source/ui/dlg/dbwizsetup.cxx
index 1dd342c12401..473c0d32ca34 100644
--- a/dbaccess/source/ui/dlg/dbwizsetup.cxx
+++ b/dbaccess/source/ui/dlg/dbwizsetup.cxx
@@ -751,7 +751,7 @@ bool ODbTypeWizDialogSetup::SaveDatabaseDocument()
             createUniqueFolderName(&aDBPathURL);
             sUrl = aDBPathURL.GetMainURL( 
INetURLObject::DecodeMechanism::NONE);
             xSimpleFileAccess->createFolder(sUrl);
-            sUrl = eType.concat(sUrl);
+            sUrl = eType + sUrl;
         }
         m_pOutSet->Put(SfxStringItem(DSID_CONNECTURL, sUrl));
         m_pImpl->saveChanges(*m_pOutSet);
@@ -817,7 +817,7 @@ bool ODbTypeWizDialogSetup::SaveDatabaseDocument()
             if (bFolderExists)
             {
                 i++;
-                pURL->setName(sLastSegmentName.concat(OUString::number(i)));
+                pURL->setName(sLastSegmentName + OUString::number(i));
             }
         }
     }
@@ -835,7 +835,7 @@ bool ODbTypeWizDialogSetup::SaveDatabaseDocument()
             bElementExists = xSimpleFileAccess->exists( 
aExistenceCheck.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
             if ( bElementExists )
             {
-                aExistenceCheck.setBase( BaseName.concat( OUString::number( i 
) ) );
+                aExistenceCheck.setBase( BaseName + OUString::number( i ) );
                 ++i;
             }
         }
diff --git a/drawinglayer/source/tools/emfpfont.cxx 
b/drawinglayer/source/tools/emfpfont.cxx
index f641fdd4d21b..609135460992 100644
--- a/drawinglayer/source/tools/emfpfont.cxx
+++ b/drawinglayer/source/tools/emfpfont.cxx
@@ -18,27 +18,28 @@
  */
 
 #include <sal/log.hxx>
+#include <rtl/ustrbuf.hxx>
 #include "emfpfont.hxx"
 
 namespace emfplushelper
 {
     static OUString FontStyleToString(sal_uInt32 style)
     {
-        OUString sStyle;
+        OUStringBuffer sStyle;
 
         if (style & FontStyleBold)
             sStyle = "\n\t\t\tFontStyleBold";
 
         if (style & FontStyleItalic)
-            sStyle = sStyle.concat("\n\t\t\tFontStyleItalic");
+            sStyle.append("\n\t\t\tFontStyleItalic");
 
         if (style & FontStyleUnderline)
-            sStyle = sStyle.concat("\n\t\t\tFontStyleUnderline");
+            sStyle.append("\n\t\t\tFontStyleUnderline");
 
         if (style & FontStyleStrikeout)
-            sStyle = sStyle.concat("\n\t\t\tFontStyleStrikeout");
+            sStyle.append("\n\t\t\tFontStyleStrikeout");
 
-        return sStyle;
+        return sStyle.makeStringAndClear();
     }
 
     void EMFPFont::Read(SvMemoryStream &s)
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx 
b/drawinglayer/source/tools/emfphelperdata.cxx
index d9aed087885f..f486d59375fd 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -214,14 +214,10 @@ namespace emfplushelper
 
     static OUString BrushIDToString(sal_uInt16 flags, sal_uInt32 brushid)
     {
-        OUString sBrushId;
-
         if (IsBrush(flags))
-            sBrushId = sBrushId.concat("EmfPlusBrush ID: 
").concat(OUString::number(brushid));
+            return "EmfPlusBrush ID: " + OUString::number(brushid);
         else
-            sBrushId = sBrushId.concat("ARGB: 
0x").concat(OUString::number(brushid, 16));
-
-        return sBrushId;
+            return "ARGB: 0x" + OUString::number(brushid, 16);
     }
 
     EMFPObject::~EMFPObject()
diff --git a/drawinglayer/source/tools/emfppen.cxx 
b/drawinglayer/source/tools/emfppen.cxx
index c5e7d457be61..60500b6bf7ec 100644
--- a/drawinglayer/source/tools/emfppen.cxx
+++ b/drawinglayer/source/tools/emfppen.cxx
@@ -21,6 +21,7 @@
 #include <com/sun/star/rendering/PathJoinType.hpp>
 #include <o3tl/safeint.hxx>
 #include <sal/log.hxx>
+#include <rtl/ustrbuf.hxx>
 
 #include "emfppen.hxx"
 #include "emfpcustomlinecap.hxx"
@@ -75,48 +76,48 @@ namespace emfplushelper
 
     static OUString PenDataFlagsToString(sal_uInt32 flags)
     {
-        OUString sFlags;
+        rtl::OUStringBuffer sFlags;
 
         if (flags & EmfPlusPenDataTransform)
-            sFlags = "\nEMF+\t\t\tEmfPlusPenDataTransform";
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataTransform");
 
         if (flags & EmfPlusPenDataStartCap)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataStartCap");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataStartCap");
 
         if (flags & EmfPlusPenDataEndCap)
-             sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataEndCap");
+             sFlags.append("\nEMF+\t\t\tEmfPlusPenDataEndCap");
 
         if (flags & EmfPlusPenDataJoin)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataJoin");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataJoin");
 
         if (flags & EmfPlusPenDataMiterLimit)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataMiterLimit");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataMiterLimit");
 
         if (flags & EmfPlusPenDataLineStyle)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataLineStyle");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataLineStyle");
 
         if (flags & EmfPlusPenDataDashedLineCap)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataDashedLineCap");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataDashedLineCap");
 
         if (flags & EmfPlusPenDataDashedLineOffset)
-            sFlags = 
sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataDashedLineOffset");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataDashedLineOffset");
 
         if (flags & EmfPlusPenDataDashedLine)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataDashedLine");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataDashedLine");
 
         if (flags & EmfPlusPenDataAlignment)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataAlignment");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataAlignment");
 
         if (flags & EmfPlusPenDataCompoundLine)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataCompoundLine");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataCompoundLine");
 
         if (flags & EmfPlusPenDataCustomStartCap)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataCustomStartCap");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataCustomStartCap");
 
         if (flags & EmfPlusPenDataCustomEndCap)
-            sFlags = sFlags.concat("\nEMF+\t\t\tEmfPlusPenDataCustomEndCap");
+            sFlags.append("\nEMF+\t\t\tEmfPlusPenDataCustomEndCap");
 
-        return sFlags;
+        return sFlags.makeStringAndClear();
     }
 
     static OUString LineCapTypeToString(sal_uInt32 linecap)
diff --git a/drawinglayer/source/tools/emfpstringformat.cxx 
b/drawinglayer/source/tools/emfpstringformat.cxx
index ad08f14a21be..a523ab80e531 100644
--- a/drawinglayer/source/tools/emfpstringformat.cxx
+++ b/drawinglayer/source/tools/emfpstringformat.cxx
@@ -18,6 +18,7 @@
  */
 
 #include <sal/log.hxx>
+#include <rtl/ustrbuf.hxx>
 #include "emfpstringformat.hxx"
 
 namespace emfplushelper
@@ -43,78 +44,78 @@ namespace emfplushelper
 
     static OUString StringFormatFlags(sal_uInt32 flag)
     {
-        OUString sFlags;
+        OUStringBuffer sFlags;
 
         if (flag & StringFormatDirectionRightToLeft)
-            sFlags = sFlags.concat("StringFormatDirectionRightToLeft");
+            sFlags.append("StringFormatDirectionRightToLeft");
 
         if (flag & StringFormatDirectionRightToLeft)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatDirectionRightToLeft");
+            sFlags.append("StringFormatDirectionRightToLeft");
         }
 
         if (flag & StringFormatNoFitBlackBox)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatNoFitBlackBox");
+            sFlags.append("StringFormatNoFitBlackBox");
         }
 
         if (flag & StringFormatDisplayFormatControl)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatDisplayFormatControl");
+            sFlags.append("StringFormatDisplayFormatControl");
         }
         if (flag & StringFormatNoFontFallback)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatNoFontFallback");
+            sFlags.append("StringFormatNoFontFallback");
         }
         if (flag & StringFormatMeasureTrailingSpaces)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatMeasureTrailingSpaces");
+            sFlags.append("StringFormatMeasureTrailingSpaces");
         }
         if (flag & StringFormatNoWrap)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatNoWrap");
+            sFlags.append("StringFormatNoWrap");
         }
         if (flag & StringFormatLineLimit)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatLineLimit");
+            sFlags.append("StringFormatLineLimit");
         }
         if (flag & StringFormatNoClip)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatNoClip");
+            sFlags.append("StringFormatNoClip");
         }
         if (flag & StringFormatBypassGDI)
         {
             if (!sFlags.isEmpty())
-                sFlags = sFlags.concat(", ");
+                sFlags.append(", ");
 
-            sFlags = sFlags.concat("StringFormatBypassGDI");
+            sFlags.append("StringFormatBypassGDI");
         }
 
-        return sFlags;
+        return sFlags.makeStringAndClear();
     }
 
     static OUString StringAlignmentString(sal_uInt32 nAlignment)
diff --git a/emfio/source/reader/emfreader.cxx 
b/emfio/source/reader/emfreader.cxx
index 1bc6339ff897..5f396bf2244a 100644
--- a/emfio/source/reader/emfreader.cxx
+++ b/emfio/source/reader/emfreader.cxx
@@ -422,7 +422,7 @@ namespace emfio
                         break;
 
                     sal_Unicode cUniChar = static_cast<sal_Unicode>(cChar);
-                    aDesc = aDesc.concat(OUString(cUniChar));
+                    aDesc = aDesc + OUStringChar(cUniChar);
                 }
 
                 SAL_INFO("emfio", "\t\tDescription: " << aDesc);
diff --git a/extensions/source/ole/oleobjw.cxx 
b/extensions/source/ole/oleobjw.cxx
index bde55278c174..532794f3992d 100644
--- a/extensions/source/ole/oleobjw.cxx
+++ b/extensions/source/ole/oleobjw.cxx
@@ -472,7 +472,7 @@ Any SAL_CALL IUnknownWrapper::getValue( const OUString& 
aPropertyName )
                         if ( SUCCEEDED( pTypeLib->GetDocumentation( -1, 
&sName, nullptr, nullptr, nullptr  ) ) )
                         {
                             OUString sLibName( o3tl::toU(LPCOLESTR(sName)));
-                            m_sTypeName = sLibName.concat( "." ).concat( sTmp 
);
+                            m_sTypeName = sLibName + "." + sTmp;
 
                         }
                     }
diff --git a/filter/source/msfilter/mstoolbar.cxx 
b/filter/source/msfilter/mstoolbar.cxx
index 441b60c3ca98..336eed1b59ef 100644
--- a/filter/source/msfilter/mstoolbar.cxx
+++ b/filter/source/msfilter/mstoolbar.cxx
@@ -488,7 +488,7 @@ TBCGeneralInfo::ImportToolBarControlData( 
CustomToolBarImportHelper& helper, std
         if ( aMacroInf.mbFound )
             aProp.Value = CustomToolBarImportHelper::createCommandFromMacro( 
aMacroInf.msResolvedMacro );
         else
-            aProp.Value <<= OUString( "UnResolvedMacro[" ).concat( 
extraInfo.getOnAction() ).concat( "]" );
+            aProp.Value <<= "UnResolvedMacro[" + extraInfo.getOnAction() + "]";
         sControlData.push_back( aProp );
     }
 
diff --git a/include/rtl/string.hxx b/include/rtl/string.hxx
index d9422c696059..be78e199c412 100644
--- a/include/rtl/string.hxx
+++ b/include/rtl/string.hxx
@@ -1393,6 +1393,7 @@ public:
         return OString( pNew, SAL_NO_ACQUIRE );
     }
 
+#ifndef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
     /**
       Concatenates the specified string to the end of this string.
 
@@ -1407,6 +1408,7 @@ public:
         rtl_string_newConcat( &pNew, pData, str.pData );
         return OString( pNew, SAL_NO_ACQUIRE );
     }
+#endif
 
 #ifndef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
     friend OString operator+( const OString & str1, const OString & str2  )
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index 707bbf6e66d6..f3006847de1e 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -2300,6 +2300,7 @@ public:
         return OUString( pNew, SAL_NO_ACQUIRE );
     }
 
+#ifndef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
     /**
       Concatenates the specified string to the end of this string.
 
@@ -2314,6 +2315,7 @@ public:
         rtl_uString_newConcat( &pNew, pData, str.pData );
         return OUString( pNew, SAL_NO_ACQUIRE );
     }
+#endif
 
 #ifndef LIBO_INTERNAL_ONLY // "RTL_FAST_STRING"
     friend OUString operator+( const OUString& rStr1, const OUString& rStr2  )
diff --git a/l10ntools/source/localize.cxx b/l10ntools/source/localize.cxx
index 35fc924a0813..e069ba6f5a5c 100644
--- a/l10ntools/source/localize.cxx
+++ b/l10ntools/source/localize.cxx
@@ -211,7 +211,7 @@ bool handleFile(const OString& rProject, const OUString& 
rUrl, const OString& rP
                 if (commands[i].executable == "uiex" || commands[i].executable 
== "hrcex")
                     sOutPath = gDestRoot + "/" + rProject + "/messages.pot";
                 else
-                    sOutPath = rPotDir.concat(".pot");
+                    sOutPath = rPotDir + ".pot";
 
                 if (!fileExists(sOutPath))
                     InitPoFile(rProject, sInPath, rPotDir, sOutPath);
@@ -363,11 +363,11 @@ void handleDirectory(
         {
             case 0: // a root directory
                 if (stat.getFileType() == osl::FileStatus::Directory && 
includeProject(sDirName))
-                    aSubDirs[stat.getFileURL()][sDirName] = 
rPotDir.concat("/").concat(sDirName);
+                    aSubDirs[stat.getFileURL()][sDirName] = rPotDir + "/" + 
sDirName;
                 break;
             default:
                 if (stat.getFileType() == osl::FileStatus::Directory)
-                    aSubDirs[stat.getFileURL()][rProject] = 
rPotDir.concat("/").concat(sDirName);
+                    aSubDirs[stat.getFileURL()][rProject] = rPotDir + "/" + 
sDirName;
                 else
                     aFileNames.push_back(stat.getFileURL());
                 break;
diff --git a/oox/source/vml/vmldrawing.cxx b/oox/source/vml/vmldrawing.cxx
index cc24d1f10468..716b07dc6e61 100644
--- a/oox/source/vml/vmldrawing.cxx
+++ b/oox/source/vml/vmldrawing.cxx
@@ -189,7 +189,7 @@ void Drawing::convertAndInsert() const
     }
     for ( const auto& BoxItr : GroupBoxMap )
     {
-        const uno::Any aGroup( OUString("autoGroup_").concat(BoxItr.first) );
+        const uno::Any aGroup( "autoGroup_" + BoxItr.first );
         for ( auto RadioItr = RadioButtonMap.begin(); RadioItr != 
RadioButtonMap.end(); )
         {
             if ( BoxItr.second.IsInside(RadioItr->second) )
diff --git a/sal/qa/osl/file/osl_File.cxx b/sal/qa/osl/file/osl_File.cxx
index 32eafc2f6db2..42c7a18a4f11 100644
--- a/sal/qa/osl/file/osl_File.cxx
+++ b/sal/qa/osl/file/osl_File.cxx
@@ -478,25 +478,25 @@ namespace osl_FileBase
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_1()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/relative/file1");
+        OUString suAssume = aUserDirectoryURL + "/relative/file1";
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"relative/file1",osl::FileBase::E_None, suAssume);
     }
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_2()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/relative/file2");
+        OUString suAssume = aUserDirectoryURL + "/relative/file2";
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"relative/./file2",osl::FileBase::E_None, suAssume);
     }
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_3()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/file3");
+        OUString suAssume = aUserDirectoryURL + "/file3";
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"relative/../file3",osl::FileBase::E_None, suAssume);
     }
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_4()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/file4");
+        OUString suAssume = aUserDirectoryURL + "/file4";
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"././relative/../file4",osl::FileBase::E_None, suAssume);
     }
 
@@ -504,16 +504,16 @@ namespace osl_FileBase
     {
         OUString suAssume;
 #if (defined UNX)
-        suAssume = aUserDirectoryURL.concat("/relative/");
+        suAssume = aUserDirectoryURL + "/relative/";
 #else
-        suAssume = aUserDirectoryURL.concat("/relative");
+        suAssume = aUserDirectoryURL + "/relative";
 #endif
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"././relative/.",osl::FileBase::E_None, suAssume);
     }
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_6()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/.relative");
+        OUString suAssume = aUserDirectoryURL + "/.relative";
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"./.relative",osl::FileBase::E_None, suAssume);
     }
 
@@ -521,16 +521,16 @@ namespace osl_FileBase
     {
         OUString suAssume;
 #if (defined UNX)
-        suAssume = aUserDirectoryURL.concat("/.a/");
+        suAssume = aUserDirectoryURL + "/.a/";
 #else // windows
-        suAssume = aUserDirectoryURL.concat("/.a");
+        suAssume = aUserDirectoryURL + "/.a";
 #endif
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"./.a/mydir/..",osl::FileBase::E_None, suAssume);
     }
 
     void getAbsoluteFileURL::getAbsoluteFileURL_001_8()
     {
-        OUString suAssume = aUserDirectoryURL.concat("/tmp/ok");
+        OUString suAssume = aUserDirectoryURL + "/tmp/ok";
 #if (defined UNX)
         check_getAbsoluteFileURL(aUserDirectoryURL, 
"tmp//ok",osl::FileBase::E_None, suAssume);
 #else
@@ -553,7 +553,7 @@ namespace osl_FileBase
         sal_Int32 fd = symlink(strSrcFileName.getStr(), 
strLinkFileName.getStr());
         CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), fd);
         OString sLnkURL = OUStringToOString(aLnkURL1, 
RTL_TEXTENCODING_ASCII_US);
-        OUString suAssume = aUserDirectoryURL.concat("/canonical.name");
+        OUString suAssume = aUserDirectoryURL + "/canonical.name";
         check_getAbsoluteFileURL(aUserDirectoryURL, sLnkURL, 
osl::FileBase::E_None, suAssume);
         deleteTestFile(aCanURL1);
         fd = remove(strLinkFileName.getStr());
@@ -574,7 +574,7 @@ namespace osl_FileBase
         OUString aUStrBase = aUserDirectoryURL + "/test1/dir1";
         createTestDirectory(aUStrBase);
 
-        OUString suAssume = aUserDirectoryURL.concat("/mytestfile");
+        OUString suAssume = aUserDirectoryURL + "/mytestfile";
         check_getAbsoluteFileURL(aUStrBase, "../../mytestfile" , 
osl::FileBase::E_None, suAssume);
         deleteTestDirectory(aUStrBase);
         deleteTestDirectory(aUStrUpBase);
diff --git a/sc/source/filter/excel/xestream.cxx 
b/sc/source/filter/excel/xestream.cxx
index 78f03e2176a6..7f434dd44fc4 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -1179,7 +1179,7 @@ void 
XclExpXmlStream::validateTabNames(std::vector<OUString>& aOriginalTabNames)
 
                 for (int i=rangeStart; i<rangeEnd && aNewName.isEmpty(); i++)
                 {
-                    aNewName = rOriginalName.copy(0, MAX_TAB_NAME_LENGTH - 1 - 
digits).concat("-").concat(OUString::number(i));
+                    aNewName = rOriginalName.copy(0, MAX_TAB_NAME_LENGTH - 1 - 
digits) + "-" + OUString::number(i);
                     if (aNewTabNames.end() != std::find(aNewTabNames.begin(), 
aNewTabNames.end(), aNewName) ||
                         aOriginalTabNames.end() != 
std::find(aOriginalTabNames.begin(), aOriginalTabNames.end(), aNewName))
                     {
diff --git a/sc/source/ui/vba/vbaeventshelper.cxx 
b/sc/source/ui/vba/vbaeventshelper.cxx
index 536423a957ca..7f70942dadae 100644
--- a/sc/source/ui/vba/vbaeventshelper.cxx
+++ b/sc/source/ui/vba/vbaeventshelper.cxx
@@ -530,13 +530,13 @@ ScVbaEventsHelper::ScVbaEventsHelper( const 
uno::Sequence< uno::Any >& rArgs ) :
 
     // global
     auto registerAutoEvent = [this](sal_Int32 nID, const char* sName)
-    { registerEventHandler(nID, script::ModuleType::NORMAL, 
(OString("Auto_").concat(sName)).getStr(), -1, uno::Any(false)); };
+    { registerEventHandler(nID, script::ModuleType::NORMAL, 
OString(OStringLiteral("Auto_") + sName).getStr(), -1, uno::Any(false)); };
     registerAutoEvent(AUTO_OPEN,  "Open");
     registerAutoEvent(AUTO_CLOSE, "Close");
 
     // Workbook
     auto registerWorkbookEvent = [this](sal_Int32 nID, const char* sName, 
sal_Int32 nCancelIndex)
-    { registerEventHandler(nID, script::ModuleType::DOCUMENT, 
(OString("Workbook_").concat(sName)).getStr(), nCancelIndex, uno::Any(false)); 
};
+    { registerEventHandler(nID, script::ModuleType::DOCUMENT, 
OString(OStringLiteral("Workbook_") + sName).getStr(), nCancelIndex, 
uno::Any(false)); };
     registerWorkbookEvent( WORKBOOK_ACTIVATE,            "Activate",           
-1 );
     registerWorkbookEvent( WORKBOOK_DEACTIVATE,          "Deactivate",         
-1 );
     registerWorkbookEvent( WORKBOOK_OPEN,                "Open",               
-1 );
@@ -552,10 +552,10 @@ ScVbaEventsHelper::ScVbaEventsHelper( const 
uno::Sequence< uno::Any >& rArgs ) :
     // Worksheet events. All events have a corresponding workbook event.
     auto registerWorksheetEvent = [this](sal_Int32 nID, const char* sName, 
sal_Int32 nCancelIndex)
     {
-        registerEventHandler(nID, script::ModuleType::DOCUMENT, 
(OString("Worksheet_").concat(sName)).getStr(),
+        registerEventHandler(nID, script::ModuleType::DOCUMENT, 
OString(OStringLiteral("Worksheet_") + sName).getStr(),
                              nCancelIndex, uno::Any(true));
         registerEventHandler(USERDEFINED_START + nID, 
script::ModuleType::DOCUMENT,
-                             
(OString("Workbook_Worksheet").concat(sName)).getStr(),
+                             OString(OStringLiteral("Workbook_Worksheet") + 
sName).getStr(),
                              ((nCancelIndex >= 0) ? (nCancelIndex + 1) : -1), 
uno::Any(false));
     };
     registerWorksheetEvent( WORKSHEET_ACTIVATE,           "Activate",          
 -1 );
diff --git a/scripting/source/dlgprov/dlgevtatt.cxx 
b/scripting/source/dlgprov/dlgevtatt.cxx
index 4f5970a49bee..b91ffc3c3a31 100644
--- a/scripting/source/dlgprov/dlgevtatt.cxx
+++ b/scripting/source/dlgprov/dlgevtatt.cxx
@@ -139,7 +139,7 @@ namespace dlgprov
             return;
 
         ScriptEvent aScriptEventCopy( aScriptEvent );
-        aScriptEventCopy.ScriptCode = msDialogLibName.concat( "." ).concat( 
msDialogCodeName );
+        aScriptEventCopy.ScriptCode = msDialogLibName + "." + msDialogCodeName;
         try
         {
             mxListener->firing( aScriptEventCopy );
diff --git a/scripting/source/protocolhandler/scripthandler.cxx 
b/scripting/source/protocolhandler/scripthandler.cxx
index 78d754300cfa..b163a2000cce 100644
--- a/scripting/source/protocolhandler/scripthandler.cxx
+++ b/scripting/source/protocolhandler/scripthandler.cxx
@@ -242,9 +242,8 @@ void SAL_CALL 
ScriptProtocolHandler::dispatchWithNotification(
         {
             aException = ::cppu::getCaughtException();
 
-            OUString reason = "ScriptProtocolHandler::dispatch: caught ";
-
-            invokeResult <<= reason.concat( aException.getValueTypeName() 
).concat( ": " ).concat( e.Message );
+            invokeResult <<= "ScriptProtocolHandler::dispatch: caught "
+                        + aException.getValueTypeName() + ": " + e.Message;
 
             bCaughtException = true;
         }
diff --git a/scripting/source/provider/URIHelper.cxx 
b/scripting/source/provider/URIHelper.cxx
index f6d2f65a672b..09fedf5762fd 100644
--- a/scripting/source/provider/URIHelper.cxx
+++ b/scripting/source/provider/URIHelper.cxx
@@ -127,7 +127,7 @@ ScriptingFrameworkURIHelper::initBaseURI()
     }
     else if (m_sLocation.startsWith("vnd.sun.star.tdoc"))
     {
-        m_sBaseURI = m_sLocation.concat( SCRIPTS_PART );
+        m_sBaseURI = m_sLocation + SCRIPTS_PART;
         m_sLocation = "document";
         return true;
     }
@@ -153,7 +153,7 @@ ScriptingFrameworkURIHelper::initBaseURI()
     {
         if ( bAppendScriptsPart )
         {
-            m_sBaseURI = pChild->concat( SCRIPTS_PART );
+            m_sBaseURI = *pChild + SCRIPTS_PART;
         }
         else
         {
diff --git a/scripting/source/vbaevents/eventhelper.cxx 
b/scripting/source/vbaevents/eventhelper.cxx
index 31e7a1bf80d2..c4404839ee4a 100644
--- a/scripting/source/vbaevents/eventhelper.cxx
+++ b/scripting/source/vbaevents/eventhelper.cxx
@@ -877,10 +877,9 @@ EventListener::firing_Impl(const ScriptEvent& evt, Any* 
pRet )
             break;
         }
 
-        OUString sTemp = sName.concat( rTxInfo.sVBAName );
         // see if we have a match for the handlerextension
         // where ScriptCode is methodname_handlerextension
-        OUString sToResolve = sMacroLoc.concat( sTemp );
+        OUString sToResolve = sMacroLoc + sName + rTxInfo.sVBAName;
 
         ooo::vba::MacroResolvedInfo aMacroResolvedInfo = 
ooo::vba::resolveVBAMacro( mpShell, sToResolve );
         if ( aMacroResolvedInfo.mbFound )
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index b71e91b6b820..d03e1be8341e 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -2155,7 +2155,7 @@ void SdTiledRenderingTest::testIMESupport()
     ESelection aWordSelection(0, 0, 0, 3); // start para, start char, end 
para, end char.
     rEditView.SetSelection(aWordSelection);
     // content contains only the last IME composition, not all
-    CPPUNIT_ASSERT_EQUAL(OUString("x").concat(aInputs[aInputs.size() - 1]), 
rEditView.GetSelected());
+    CPPUNIT_ASSERT_EQUAL(OUString("x" + aInputs[aInputs.size() - 1]), 
rEditView.GetSelected());
 }
 
 void SdTiledRenderingTest::testTdf115783()
diff --git a/sdext/source/minimizer/informationdialog.cxx 
b/sdext/source/minimizer/informationdialog.cxx
index 8ab6ddfbd8cf..736802475167 100644
--- a/sdext/source/minimizer/informationdialog.cxx
+++ b/sdext/source/minimizer/informationdialog.cxx
@@ -260,7 +260,7 @@ void InformationDialog::InitDialog()
         xURLTransformer->parseSmart( aURL, OUString() );
 
         const OUString sFileProtocol( "file:///" );
-        aPresentationURL.Complete = sFileProtocol.concat( aURL.Name );
+        aPresentationURL.Complete = sFileProtocol + aURL.Name;
         aTitle = xURLTransformer->getPresentation( aPresentationURL, false );
 
         if ( aTitle.match( sFileProtocol ) )
diff --git a/sdext/source/minimizer/optimizerdialogcontrols.cxx 
b/sdext/source/minimizer/optimizerdialogcontrols.cxx
index 13fe926dd36e..79832c36fb2f 100644
--- a/sdext/source/minimizer/optimizerdialogcontrols.cxx
+++ b/sdext/source/minimizer/optimizerdialogcontrols.cxx
@@ -853,7 +853,7 @@ void OptimizerDialog::InitPage4()
     const std::vector< OptimizerSettings >& rList( GetOptimizerSettings() );
     do
     {
-        OUString aTemp( aDefault.concat( OUString::number( nSession++ ) ) );
+        OUString aTemp = aDefault + OUString::number( nSession++ );
         for ( i = 1; i < rList.size(); i++ )
         {
             if ( rList[ i ].maName == aTemp )
diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx 
b/sw/qa/extras/tiledrendering/tiledrendering.cxx
index 0b790648d50c..9f8f074a4568 100644
--- a/sw/qa/extras/tiledrendering/tiledrendering.cxx
+++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx
@@ -2177,7 +2177,7 @@ void SwTiledRenderingTest::testIMESupport()
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), 
pShellCursor->GetPoint()->nContent.GetIndex());
 
     // content contains only the last IME composition, not all
-    CPPUNIT_ASSERT_EQUAL(aInputs[aInputs.size() - 1].concat("Aaa bbb."), 
pShellCursor->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
+    CPPUNIT_ASSERT_EQUAL(OUString(aInputs[aInputs.size() - 1] + "Aaa bbb."), 
pShellCursor->GetPoint()->nNode.GetNode().GetTextNode()->GetText());
 }
 
 void SwTiledRenderingTest::testSplitNodeRedlineCallback()
diff --git a/sw/source/ui/vba/vbaoptions.cxx b/sw/source/ui/vba/vbaoptions.cxx
index 7fd79bd6ca80..dd3cb2227435 100644
--- a/sw/source/ui/vba/vbaoptions.cxx
+++ b/sw/source/ui/vba/vbaoptions.cxx
@@ -103,7 +103,7 @@ void SwVbaOptions::setValueEvent( const uno::Any& value )
     sal_Int32 nIndex = sOldPathUrl.lastIndexOf( ';' );
     if( nIndex != -1 )
     {
-        sNewPathUrl = sOldPathUrl.copy( 0, nIndex + 1 ).concat( sNewPathUrl );
+        sNewPathUrl = sOldPathUrl.copy( 0, nIndex + 1 ) + sNewPathUrl;
     }
     xPathSettings->setPropertyValue( msDefaultFilePath, uno::makeAny( 
sNewPathUrl ) );
 }
diff --git a/unodevtools/source/skeletonmaker/cppcompskeleton.cxx 
b/unodevtools/source/skeletonmaker/cppcompskeleton.cxx
index b1fc3ac33035..3bbcee31dbf7 100644
--- a/unodevtools/source/skeletonmaker/cppcompskeleton.cxx
+++ b/unodevtools/source/skeletonmaker/cppcompskeleton.cxx
@@ -860,7 +860,7 @@ static void generateMethodBodies(std::ostream& o,
         OString const & comphelpernamespace,
         OUString const & propertyhelper)
 {
-    OString name(classname.concat("::"));
+    OString name = classname + "::";
     codemaker::GeneratedTypeSet generated;
     for (const auto& rIface : interfaces) {
         if ( rIface == "com.sun.star.lang.XServiceInfo" ) {
diff --git a/vbahelper/source/msforms/vbauserform.cxx 
b/vbahelper/source/msforms/vbauserform.cxx
index 8f3c158c4e5a..c82a84fd1035 100644
--- a/vbahelper/source/msforms/vbauserform.cxx
+++ b/vbahelper/source/msforms/vbauserform.cxx
@@ -256,7 +256,7 @@ ScVbaUserForm::getValue( const OUString& aPropertyName )
             uno::Reference< msforms::XControl > xVBAControl = 
ScVbaControlFactory::createUserformControl( mxContext, xControl, 
xDialogControl, m_xModel, mpGeometryHelper->getOffsetX(), 
mpGeometryHelper->getOffsetY() );
             ScVbaControl* pControl  = dynamic_cast< ScVbaControl* >( 
xVBAControl.get() );
             if (pControl && !m_sLibName.isEmpty())
-                pControl->setLibraryAndCodeName( m_sLibName.concat( "." 
).concat( getName() ) );
+                pControl->setLibraryAndCodeName( m_sLibName + "." + getName() 
);
             aResult <<= xVBAControl;
         }
     }
commit dfb2e07e32694c220e791574b7a6c05f5648c0c2
Author:     Noel Grandin <noelgran...@gmail.com>
AuthorDate: Tue Nov 10 14:53:01 2020 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed Nov 11 06:33:32 2020 +0100

    loplugin:xmlimport add more checks
    
    to find places where the slowparser -> fastparser conversion
    work is incomplete, fixing one bug in the process.
    
    Change-Id: Ifd0d801d71eee0aaf25287fbac1a4237a811e7c8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105511
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/compilerplugins/clang/test/xmlimport.cxx 
b/compilerplugins/clang/test/xmlimport.cxx
index 98dba400b19e..d2fb23a69c78 100644
--- a/compilerplugins/clang/test/xmlimport.cxx
+++ b/compilerplugins/clang/test/xmlimport.cxx
@@ -192,4 +192,36 @@ public:
     virtual SvXMLImportContextRef CreateChildContext() override { return 
nullptr; }
 };
 
+enum XmlTokens
+{
+    XML_TOK_1
+};
+
+void test20(sal_uInt32 p, sal_uInt16 q, XmlTokens e)
+{
+    // expected-error@+1 {{comparing XML_TOK enum to 'sal_uInt32', expected 
sal_uInt16 [loplugin:xmlimport]}}
+    if (p == XML_TOK_1)
+        ;
+    // no warning expected
+    if (q == XML_TOK_1)
+        ;
+    switch (p)
+    {
+        // expected-error@+1 {{comparing XML_TOK enum to 'sal_uInt32', 
expected sal_uInt16 [loplugin:xmlimport]}}
+        case XML_TOK_1:
+            break;
+    }
+    switch (q)
+    {
+        // no warning expected
+        case XML_TOK_1:
+            break;
+    }
+    switch (e)
+    {
+        // no warning expected
+        case XML_TOK_1:
+            break;
+    }
+}
 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/compilerplugins/clang/xmlimport.cxx 
b/compilerplugins/clang/xmlimport.cxx
index f9e5659d71c0..e01f387e0c74 100644
--- a/compilerplugins/clang/xmlimport.cxx
+++ b/compilerplugins/clang/xmlimport.cxx
@@ -71,8 +71,13 @@ public:
 
     bool VisitCXXMethodDecl(const CXXMethodDecl*);
     bool VisitCXXMemberCallExpr(const CXXMemberCallExpr*);
+    bool VisitBinaryOperator(const BinaryOperator*);
+    bool VisitSwitchStmt(const SwitchStmt*);
 
 private:
+    bool isXmlTokEnum(const Expr*);
+    bool isUInt16(const Expr*);
+
     std::unordered_map<const CXXRecordDecl*, const CXXMethodDecl*> 
startFastElementSet;
     std::unordered_map<const CXXRecordDecl*, const CXXMethodDecl*> 
StartElementSet;
     std::unordered_map<const CXXRecordDecl*, const CXXMethodDecl*> 
endFastElementSet;
@@ -259,6 +264,82 @@ bool XmlImport::VisitCXXMemberCallExpr(const 
CXXMemberCallExpr* callExpr)
     return true;
 }
 
+bool XmlImport::VisitBinaryOperator(const BinaryOperator* binaryOp)
+{
+    auto beginLoc = compat::getBeginLoc(binaryOp);
+    if (!beginLoc.isValid() || ignoreLocation(binaryOp))
+        return true;
+    auto op = binaryOp->getOpcode();
+    if (op != BO_EQ && op != BO_NE)
+        return true;
+    auto check2 = [&](const Expr* expr) -> void {
+        if (!isUInt16(expr))
+            report(DiagnosticsEngine::Warning,
+                   "comparing XML_TOK enum to 'sal_uInt32', expected 
sal_uInt16",
+                   compat::getBeginLoc(binaryOp))
+                << binaryOp->getSourceRange();
+    };
+    if (isXmlTokEnum(binaryOp->getLHS()))
+        check2(binaryOp->getRHS());
+    else if (isXmlTokEnum(binaryOp->getRHS()))
+        check2(binaryOp->getLHS());
+    return true;
+}
+
+bool XmlImport::VisitSwitchStmt(const SwitchStmt* switchStmt)
+{
+    auto beginLoc = compat::getBeginLoc(switchStmt);
+    if (!beginLoc.isValid() || ignoreLocation(switchStmt))
+        return true;
+    if (isUInt16(switchStmt->getCond()))
+        return true;
+    // if the condition is an enum type, ignore this switch
+    auto condEnumType = compat::IgnoreImplicit(switchStmt->getCond())
+                            ->getType()
+                            ->getUnqualifiedDesugaredType()
+                            ->getAs<EnumType>();
+    if (condEnumType)
+        return true;
+    auto switchCaseStmt = switchStmt->getSwitchCaseList();
+    for (; switchCaseStmt != nullptr; switchCaseStmt = 
switchCaseStmt->getNextSwitchCase())
+    {
+        auto caseStmt = dyn_cast<CaseStmt>(switchCaseStmt);
+        if (!caseStmt)
+            continue;
+        if (!isXmlTokEnum(caseStmt->getLHS()))
+            continue;
+        report(DiagnosticsEngine::Warning,
+               "comparing XML_TOK enum to 'sal_uInt32', expected sal_uInt16",
+               compat::getBeginLoc(caseStmt))
+            << caseStmt->getSourceRange();
+    }
+    return true;
+}
+
+bool XmlImport::isXmlTokEnum(const Expr* expr)
+{
+    expr = compat::IgnoreImplicit(expr);
+    // check that we have an unscoped enum type
+    auto condEnumType = 
expr->getType()->getUnqualifiedDesugaredType()->getAs<EnumType>();
+    if (!condEnumType || condEnumType->getDecl()->isScoped())
+        return false;
+    auto declRefExpr = dyn_cast<DeclRefExpr>(expr);
+    if (!declRefExpr)
+        return false;
+    auto enumConstant = dyn_cast<EnumConstantDecl>(declRefExpr->getDecl());
+    if (!enumConstant)
+        return false;
+    return enumConstant->getIdentifier() && 
enumConstant->getName().startswith("XML_TOK_");
+}
+
+bool XmlImport::isUInt16(const Expr* expr)
+{
+    expr = compat::IgnoreImplicit(expr);
+    if (expr->getType()->isSpecificBuiltinType(BuiltinType::UShort))
+        return true;
+    return bool(loplugin::TypeCheck(expr->getType()).Typedef("sal_uInt16"));
+}
+
 loplugin::Plugin::Registration<XmlImport> xmlimport("xmlimport");
 
 } // namespace
diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx
index 6612f86dbe92..58f0d08c46b9 100644
--- a/xmloff/source/text/txtfldi.cxx
+++ b/xmloff/source/text/txtfldi.cxx
@@ -3700,7 +3700,7 @@ void XMLDropDownFieldImportContext::ProcessAttribute(
         sHelp = sAttrValue;
         bHelpOK = true;
     }
-    else if (nAttrToken == XML_TOK_TEXTFIELD_HINT)
+    else if (nAttrToken ==  XML_ELEMENT(TEXT, XML_HINT))
     {
         sHint = sAttrValue;
         bHintOK = true;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to