summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2018-07-04 15:51:02 +0200
committerStephan Bergmann <sbergman@redhat.com>2018-07-04 23:04:00 +0200
commita9303d85a4f201a42322e8e4ce5ebe6e6ca728b0 (patch)
treedd55c9ce5d9d59d92fcc93130316f5a4e96810ea
parent8d69ca2d310de2e6275b93b4fd6cd40f05e9e84e (diff)
Make brittle SortedAutoCompleteStrings ownership handling more explicit
Change-Id: Ieaf2231a84d97528bb1b9a410c4ee0c38966dd27 Reviewed-on: https://gerrit.libreoffice.org/56950 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r--config_host/config_global.h.in3
-rw-r--r--configure.ac23
-rw-r--r--include/editeng/swafopt.hxx20
-rw-r--r--sw/source/uibase/app/docsh2.cxx4
4 files changed, 46 insertions, 4 deletions
diff --git a/config_host/config_global.h.in b/config_host/config_global.h.in
index e0dc1418e9cb..2bb60ca656ac 100644
--- a/config_host/config_global.h.in
+++ b/config_host/config_global.h.in
@@ -23,4 +23,7 @@ Any change in this header will cause a rebuild of almost everything.
/* Compiler supports __attribute__((warn_unused)). */
#define HAVE_GCC_ATTRIBUTE_WARN_UNUSED 0
+/* Guaranteed copy elision (C++17), __cpp_guaranteed_copy_elision (C++2a): */
+#define HAVE_CPP_GUARANTEED_COPY_ELISION 0
+
#endif
diff --git a/configure.ac b/configure.ac
index bc76475962c9..45c19e72b9c0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6482,6 +6482,29 @@ if test "$GCC" = yes; then
fi
AC_SUBST([HAVE_GCC_FNO_SIZED_DEALLOCATION])
+HAVE_CPP_GUARANTEED_COPY_ELISION=
+AC_MSG_CHECKING([whether $CXX supports guaranteed copy elision])
+AC_LANG_PUSH([C++])
+save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+ #if !defined __cpp_guaranteed_copy_elision
+ struct S {
+ private:
+ S(S const &);
+ public:
+ S copy() const { return *this; }
+ };
+ void f(S & s) { S c(s.copy()); }
+ #endif
+ ])], [
+ AC_DEFINE([HAVE_CPP_GUARANTEED_COPY_ELISION],[1])
+ AC_MSG_RESULT([yes])
+ ], [AC_MSG_RESULT([no])])
+CXXFLAGS=$save_CXXFLAGS
+AC_LANG_POP([C++])
+AC_SUBST([HAVE_CPP_GUARANTEED_COPY_ELISION])
+
dnl ===================================================================
dnl system stl sanity tests
dnl ===================================================================
diff --git a/include/editeng/swafopt.hxx b/include/editeng/swafopt.hxx
index e8d7d3a6facf..f3b34adb32a7 100644
--- a/include/editeng/swafopt.hxx
+++ b/include/editeng/swafopt.hxx
@@ -20,6 +20,9 @@
#ifndef INCLUDED_EDITENG_SWAFOPT_HXX
#define INCLUDED_EDITENG_SWAFOPT_HXX
+#include <sal/config.h>
+
+#include <config_global.h>
#include <editeng/editengdllapi.h>
#include <o3tl/sorted_vector.hxx>
#include <rtl/ustring.hxx>
@@ -52,8 +55,23 @@ struct CompareAutoCompleteString
class SortedAutoCompleteStrings
: public o3tl::sorted_vector<IAutoCompleteString*, CompareAutoCompleteString>
{
+ bool owning_;
+
+ void operator =(SortedAutoCompleteStrings) = delete;
+
+#if !HAVE_CPP_GUARANTEED_COPY_ELISION
+public:
+#endif
+ // For createNonOwningCopy only:
+ SortedAutoCompleteStrings(SortedAutoCompleteStrings const & other):
+ sorted_vector(other), owning_(false) {}
+
public:
- ~SortedAutoCompleteStrings() { DeleteAndDestroyAll(); }
+ SortedAutoCompleteStrings(): owning_(true) {}
+
+ ~SortedAutoCompleteStrings() { if (owning_) DeleteAndDestroyAll(); }
+
+ SortedAutoCompleteStrings createNonOwningCopy() const { return *this; }
};
} // namespace editeng
diff --git a/sw/source/uibase/app/docsh2.cxx b/sw/source/uibase/app/docsh2.cxx
index 1d1972da0f04..ab4c22a5b718 100644
--- a/sw/source/uibase/app/docsh2.cxx
+++ b/sw/source/uibase/app/docsh2.cxx
@@ -421,7 +421,7 @@ void SwDocShell::Execute(SfxRequest& rReq)
rACW.SetLockWordLstLocked( true );
- editeng::SortedAutoCompleteStrings aTmpLst( rACW.GetWordList() );
+ editeng::SortedAutoCompleteStrings aTmpLst( rACW.GetWordList().createNonOwningCopy() );
pAFlags->m_pAutoCompleteList = &aTmpLst;
SfxApplication* pApp = SfxGetpApp();
@@ -455,8 +455,6 @@ void SwDocShell::Execute(SfxRequest& rReq)
// clear the temp WordList pointer
pAFlags->m_pAutoCompleteList = nullptr;
}
- // remove all pointer we never delete the strings
- aTmpLst.clear();
if( !bOldAutoCmpltCollectWords && bOldAutoCmpltCollectWords !=
pAFlags->bAutoCmpltCollectWords )