From 0b2638253321db90e9844f04cd7299c1a2e1633a Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Sat, 6 Apr 2019 23:37:56 -0700 Subject: [PATCH] uClibc++: Update to 0.2.5 Switched to xz archives for smaller size. Removed upstreamed patches. Reorganized Makefile a little bit for clarity. Build/Prepare is not useful anymore. Upstream converted the file to LF. Refreshed config. Removed -ansi option from the original CFLAGS as this was causing long long support to be missing. Removed fPIC. We have the macro $(FPIC) already used. No point in setting fpic and fPIC together. Removed pedantic -Wlong-long warnings as they are not useful. Removed -std=gnu++98. Not only is it unnecessary (it compiles against all standards), it actually results in a size increase. 75843 vs. 75222 (gcc in OpenWrt defaults to g++14). Added --gc-sections to linker flags to reduce size: 72653 vs 75222. Removed warn linker options. They have been upstreamed. Tested on Archer C7v2 and GnuBee PC1. Signed-off-by: Rosen Penev --- package/libs/uclibc++/Makefile | 28 ++--- package/libs/uclibc++/files/config.default | 10 +- .../libs/uclibc++/patches/001-no-ansi.patch | 10 ++ .../uclibc++/patches/002-path_to_bash.patch | 11 -- .../libs/uclibc++/patches/002-quote-fix.patch | 13 ++ .../libs/uclibc++/patches/003-no-fPIC.patch | 10 ++ .../uclibc++/patches/004-no-pedantic.patch | 13 ++ .../libs/uclibc++/patches/006-eabi_fix.patch | 38 ------ .../uclibc++/patches/010-honor-ldflags.patch | 23 ---- .../uclibc++/patches/020-template-fix.patch | 22 ---- .../patches/030-memory_corruption_fix.patch | 114 ------------------ .../uclibc++/patches/040-delete-c++14.patch | 20 --- ...-erase-on-derived-__base_associative.patch | 40 ------ 13 files changed, 61 insertions(+), 291 deletions(-) create mode 100644 package/libs/uclibc++/patches/001-no-ansi.patch delete mode 100644 package/libs/uclibc++/patches/002-path_to_bash.patch create mode 100644 package/libs/uclibc++/patches/002-quote-fix.patch create mode 100644 package/libs/uclibc++/patches/003-no-fPIC.patch create mode 100644 package/libs/uclibc++/patches/004-no-pedantic.patch delete mode 100644 package/libs/uclibc++/patches/006-eabi_fix.patch delete mode 100644 package/libs/uclibc++/patches/010-honor-ldflags.patch delete mode 100644 package/libs/uclibc++/patches/020-template-fix.patch delete mode 100644 package/libs/uclibc++/patches/030-memory_corruption_fix.patch delete mode 100644 package/libs/uclibc++/patches/040-delete-c++14.patch delete mode 100644 package/libs/uclibc++/patches/050-Bugfix-erase-on-derived-__base_associative.patch diff --git a/package/libs/uclibc++/Makefile b/package/libs/uclibc++/Makefile index 7133a7ef33..763e0d9e4d 100644 --- a/package/libs/uclibc++/Makefile +++ b/package/libs/uclibc++/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uclibc++ -PKG_VERSION:=0.2.4 -PKG_RELEASE:=3 +PKG_VERSION:=0.2.5 +PKG_RELEASE:=1 -PKG_SOURCE:=uClibc++-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_URL:=http://cxx.uclibc.org/src/ -PKG_HASH:=be16fc6a6eb2e59df420ee41e7042f38e27ebaf5c2762d90e75803364a7b00db +PKG_SOURCE:=uClibc++-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://cxx.uclibc.org/src/ +PKG_HASH:=596fb9ed7295564ce4c70ae6076a18f92e72f70310d70c98520bbca85c77895a PKG_BUILD_DIR:=$(BUILD_DIR)/uClibc++-$(PKG_VERSION) PKG_BUILD_PARALLEL:=1 @@ -30,7 +30,7 @@ define Package/uclibcxx SECTION:=libs CATEGORY:=Libraries TITLE:=C++ library for embedded systems - URL:=http://cxx.uclibc.org/src/ + URL:=https://cxx.uclibc.org/ endef UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \ @@ -45,7 +45,8 @@ UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \ -e 's/mipsel.*/mips/' \ ) -TARGET_CFLAGS += $(FPIC) +TARGET_CFLAGS += $(FPIC) -nostdinc++ +TARGET_LDFLAGS += -Wl,--gc-sections ifneq ($(CONFIG_CCACHE),) TARGET_CXX=$(TARGET_CXX_NOCACHE) @@ -56,24 +57,15 @@ SSP_LIB=-lssp_nonshared endif MAKE_FLAGS:= \ - TOPDIR="$(PKG_BUILD_DIR)/" \ $(TARGET_CONFIGURE_OPTS) \ CPU_CFLAGS="$(TARGET_CFLAGS)" \ - CROSS="$(TARGET_CROSS)" \ - LDFLAGS="-Wl,--warn-common -Wl,--warn-once -Wl,-z,combreloc -Wl,-z,defs $(TARGET_LDFLAGS)" \ - CP="$(CP)" \ + CROSS_COMPILE="$(TARGET_CROSS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" \ GEN_LIBS="-lc $(LIBGCC_S) $(SSP_LIB)" \ - GEN_CFLAGS="-std=gnu++98 -nostdinc++" \ check_as_needed= # check_as_needed overrides dependency on libgcc_s -define Build/Prepare - $(PKG_UNPACK) - $(SED) 's/\r$$$$//' $(PKG_BUILD_DIR)/include/unwind-cxx.h - $(Build/Patch) -endef - define Build/Configure if [ -f ./files/config.$(UCLIBC_TARGET_ARCH) ]; then \ cp ./files/config.$(UCLIBC_TARGET_ARCH) $(PKG_BUILD_DIR)/.config; \ diff --git a/package/libs/uclibc++/files/config.default b/package/libs/uclibc++/files/config.default index 944e1a6cfb..d76670e969 100644 --- a/package/libs/uclibc++/files/config.default +++ b/package/libs/uclibc++/files/config.default @@ -8,7 +8,7 @@ UCLIBCXX_HAS_FLOATS=y # UCLIBCXX_HAS_LONG_DOUBLE is not set # UCLIBCXX_HAS_TLS is not set -WARNINGS="-Wall" +UCLIBCXX_WARNINGS="" BUILD_EXTRA_LIBRARIES="" HAVE_DOT_CONFIG=y @@ -23,10 +23,10 @@ UCLIBCXX_SUPPORT_CIN=y UCLIBCXX_SUPPORT_COUT=y UCLIBCXX_SUPPORT_CERR=y UCLIBCXX_SUPPORT_CLOG=y -UCLIBCXX_SUPPORT_WCIN=y -UCLIBCXX_SUPPORT_WCOUT=y -UCLIBCXX_SUPPORT_WCERR=y -UCLIBCXX_SUPPORT_WCLOG=y +# UCLIBCXX_SUPPORT_WCIN is not set +# UCLIBCXX_SUPPORT_WCOUT is not set +# UCLIBCXX_SUPPORT_WCERR is not set +# UCLIBCXX_SUPPORT_WCLOG is not set # # STL and Code Expansion diff --git a/package/libs/uclibc++/patches/001-no-ansi.patch b/package/libs/uclibc++/patches/001-no-ansi.patch new file mode 100644 index 0000000000..7ddbf52f00 --- /dev/null +++ b/package/libs/uclibc++/patches/001-no-ansi.patch @@ -0,0 +1,10 @@ +--- a/Rules.mak ++++ b/Rules.mak +@@ -232,7 +232,6 @@ endif + GEN_CXXFLAGS:=-nostdinc++ + GEN_CXXFLAGS+=$(if $(CXXFLAG_-fvisibility-inlines-hidden),-DGCC_HASCLASSVISIBILITY) + CXXFLAGS:=$(CFLAGS) +-CFLAGS += -ansi + + LIBGCC:=$(shell $(CC) -print-libgcc-file-name) + LIBGCC_DIR:=$(dir $(LIBGCC)) diff --git a/package/libs/uclibc++/patches/002-path_to_bash.patch b/package/libs/uclibc++/patches/002-path_to_bash.patch deleted file mode 100644 index 26d88ee4dd..0000000000 --- a/package/libs/uclibc++/patches/002-path_to_bash.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/bin/Makefile -+++ b/bin/Makefile -@@ -13,7 +13,7 @@ install: - $(INSTALL) -m 755 $(WRAPPER) $(PREFIX)$(UCLIBCXX_RUNTIME_BINDIR) - - $(WRAPPER): Makefile -- echo '#!/bin/sh' > $@ -+ echo '#!/usr/bin/env bash' > $@ - echo '' >> $@ - echo 'WRAPPER_INCLUDEDIR="$${WRAPPER_INCLUDEDIR:=-I$(UCLIBCXX_RUNTIME_INCLUDEDIR)}"' >> $@ - echo 'WRAPPER_LIBDIR="$${WRAPPER_LIBDIR:=-L$(UCLIBCXX_RUNTIME_LIBDIR)}"' >> $@ diff --git a/package/libs/uclibc++/patches/002-quote-fix.patch b/package/libs/uclibc++/patches/002-quote-fix.patch new file mode 100644 index 0000000000..49e7ac3d14 --- /dev/null +++ b/package/libs/uclibc++/patches/002-quote-fix.patch @@ -0,0 +1,13 @@ +--- a/bin/Makefile.in ++++ b/bin/Makefile.in +@@ -44,8 +44,8 @@ define do_wrapper + $(Q)echo ' WRAPPER_OPTIONS="$$WRAPPER_OPTIONS -nodefaultlibs $$WRAPPER_LIBDIR -l$(LNAME) $$WRAPPER_LIBS"' >> $@.tmp + $(Q)echo 'fi' >> $@.tmp + $(Q)echo '' >> $@.tmp +- $(Q)echo '[ -n "$$V" ] && [ $$V -gt 1 ] && echo $(CXX) $(GEN_CFLAGS) $(GEN_CXXFLAGS) $(EH_CXXFLAGS) $$WRAPPER_INCLUDEDIR "$$@" $$WRAPPER_OPTIONS' >> $@.tmp +- $(Q)echo 'exec $(CXX) $(GEN_CFLAGS) $(GEN_CXXFLAGS) $(EH_CXXFLAGS) $$WRAPPER_INCLUDEDIR "$$@" $$WRAPPER_OPTIONS' >> $@.tmp ++ $(Q)echo '[ -n "$$V" ] && [ $$V -gt 1 ] && echo $(CXX) $(GEN_CFLAGS) $(GEN_CXXFLAGS) $(EH_CXXFLAGS) $$WRAPPER_INCLUDEDIR $$@ $$WRAPPER_OPTIONS' >> $@.tmp ++ $(Q)echo 'exec $(CXX) $(GEN_CFLAGS) $(GEN_CXXFLAGS) $(EH_CXXFLAGS) $$WRAPPER_INCLUDEDIR $$@ $$WRAPPER_OPTIONS' >> $@.tmp + $(Q)echo '' >> $@.tmp + $(Q)chmod 0755 $@.tmp + $(Q)mv $@.tmp $@ diff --git a/package/libs/uclibc++/patches/003-no-fPIC.patch b/package/libs/uclibc++/patches/003-no-fPIC.patch new file mode 100644 index 0000000000..206a00de32 --- /dev/null +++ b/package/libs/uclibc++/patches/003-no-fPIC.patch @@ -0,0 +1,10 @@ +--- a/Rules.mak ++++ b/Rules.mak +@@ -185,7 +185,6 @@ export UCLIBCXX_RUNTIME_PREFIX UCLIBCXX_RUNTIME_LIBDIR UCLIBCXX_RUNTIME_BINDIR U + + WRAPPER = $(top_builddir)bin/g++-uc + OPTIMIZATION:= +-PICFLAG:=-fPIC + + # use '-Os' optimization if available, else use -O2, allow Config to override + $(eval $(call check-gcc-var,-Os)) diff --git a/package/libs/uclibc++/patches/004-no-pedantic.patch b/package/libs/uclibc++/patches/004-no-pedantic.patch new file mode 100644 index 0000000000..5128ca3f83 --- /dev/null +++ b/package/libs/uclibc++/patches/004-no-pedantic.patch @@ -0,0 +1,13 @@ +--- a/Rules.mak ++++ b/Rules.mak +@@ -200,10 +200,6 @@ $(eval $(call check-gxx-var,-std=gnu++14)) + $(eval $(call check-gxx-var,-Wno-sized-deallocation)) + $(eval $(call check-gxx-var,-Wno-tautological-compare)) + +-# Add a bunch of extra pedantic annoyingly strict checks +-XWARNINGS=$(call qstrip,$(UCLIBCXX_WARNINGS)) -Wno-trigraphs -pedantic +-CPU_CFLAGS=$(call qstrip,$(CPU_CFLAGS-y)) +- + # Some nice CFLAGS to work with + GEN_CFLAGS:=-fno-builtin + CFLAGS:=$(XWARNINGS) $(CPU_CFLAGS) diff --git a/package/libs/uclibc++/patches/006-eabi_fix.patch b/package/libs/uclibc++/patches/006-eabi_fix.patch deleted file mode 100644 index 893c2d60b6..0000000000 --- a/package/libs/uclibc++/patches/006-eabi_fix.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/include/typeinfo -+++ b/include/typeinfo -@@ -44,6 +44,7 @@ namespace __cxxabiv1 - class __class_type_info; - } // namespace __cxxabiv1 - -+#ifndef __GXX_MERGED_TYPEINFO_NAMES - #if !__GXX_WEAK__ - // If weak symbols are not supported, typeinfo names are not merged. - #define __GXX_MERGED_TYPEINFO_NAMES 0 -@@ -51,6 +52,7 @@ namespace __cxxabiv1 - // On platforms that support weak symbols, typeinfo names are merged. - #define __GXX_MERGED_TYPEINFO_NAMES 1 - #endif -+#endif - - namespace std - { ---- a/include/unwind-cxx.h -+++ b/include/unwind-cxx.h -@@ -173,6 +173,7 @@ extern std::unexpected_handler __unexpec - - // This is the exception class we report -- "GNUCC++\0". - const _Unwind_Exception_Class __gxx_exception_class -+#ifndef __ARM_EABI_UNWINDER__ - = ((((((((_Unwind_Exception_Class) 'G' - << 8 | (_Unwind_Exception_Class) 'N') - << 8 | (_Unwind_Exception_Class) 'U') -@@ -181,6 +182,9 @@ const _Unwind_Exception_Class __gxx_exce - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '+') - << 8 | (_Unwind_Exception_Class) '\0'); -+#else -+= "GNUC++"; -+#endif - - // GNU C++ personality routine, Version 0. - extern "C" _Unwind_Reason_Code __gxx_personality_v0 diff --git a/package/libs/uclibc++/patches/010-honor-ldflags.patch b/package/libs/uclibc++/patches/010-honor-ldflags.patch deleted file mode 100644 index b1050cb1bd..0000000000 --- a/package/libs/uclibc++/patches/010-honor-ldflags.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/src/Makefile -+++ b/src/Makefile -@@ -3,9 +3,9 @@ include $(TOPDIR)Rules.mak - - WR_CXX := WRAPPER_INCLUDEDIR=-I$(TOPDIR)include $(TOPDIR)bin/g++-uc - --LDFLAGS += -nodefaultlibs -shared -Wl,-soname,$(SHARED_MAJORNAME) $(BUILD_EXTRA_LIBRARIES) -+EXTRA_LDFLAGS += -nodefaultlibs -shared -Wl,-soname,$(SHARED_MAJORNAME) $(BUILD_EXTRA_LIBRARIES) - ifneq ($(DODEBUG),y) --LDFLAGS += -Wl,-s -+EXTRA_LDFLAGS += -Wl,-s - endif - - SRCS = $(wildcard *.cpp) -@@ -60,7 +60,7 @@ $(LIBNAME).a: libgcc_eh libsupc $(EXOBJS - $(RANLIB) $@ - - $(SHARED_FULLNAME): libgcc_eh libsupc $(EXOBJS) -- $(CC) $(LDFLAGS) -o $@ $(EXOBJS) $(SUPOBJS) $(GCCOBJS) $(LIBS) -+ $(CC) $(LDFLAGS) $(EXTRA_LDFLAGS) -o $@ $(EXOBJS) $(SUPOBJS) $(GCCOBJS) $(LIBS) - $(LN) $@ $(SHARED_MAJORNAME) - $(LN) $(SHARED_MAJORNAME) $(LIBNAME).so - diff --git a/package/libs/uclibc++/patches/020-template-fix.patch b/package/libs/uclibc++/patches/020-template-fix.patch deleted file mode 100644 index f7cc09e140..0000000000 --- a/package/libs/uclibc++/patches/020-template-fix.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/include/ostream -+++ b/include/ostream -@@ -294,7 +294,7 @@ namespace std { - #endif - #endif - -- template > -+ template - class _UCXXEXPORT basic_ostream::sentry - { - bool ok; ---- a/include/istream -+++ b/include/istream -@@ -340,7 +340,7 @@ namespace std{ - - }; - -- template > class _UCXXEXPORT basic_istream::sentry { -+ template class _UCXXEXPORT basic_istream::sentry { - bool ok; - public: - explicit _UCXXEXPORT sentry(basic_istream& os, bool noskipws = false){ diff --git a/package/libs/uclibc++/patches/030-memory_corruption_fix.patch b/package/libs/uclibc++/patches/030-memory_corruption_fix.patch deleted file mode 100644 index e34efdbb15..0000000000 --- a/package/libs/uclibc++/patches/030-memory_corruption_fix.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 1dc865b8bbb3911abc8ce53c7ae8a59dc90f6fc3 Mon Sep 17 00:00:00 2001 -From: Ivan Kold -Date: Thu, 3 Mar 2016 12:56:30 -0800 -Subject: [PATCH] Fix throw statement causing memory corruption - -The __cxxabiv1::__cxa_throw in the GCC's libsupc++ expects -sizeof(__cxa_refcounted_exception) bytes be allocated before -exception object. -uClibc++ allocates only sizeof(__cxa_exception) before an -exception object. -The __cxxabiv1::__cxa_throw writes in memory before allocated: -// gcc-5.2.0/libstdc++-v3/libsupc++/eh_throw.cc:69 -__cxa_refcounted_exception *header - = __get_refcounted_exception_header_from_obj (obj); -header->referenceCount = 1; - -Signed-off-by: Ivan Kold ---- - include/unwind-cxx.h | 34 +++++++++++++++++++++++++++++++++- - src/eh_alloc.cpp | 8 ++++---- - 2 files changed, 37 insertions(+), 5 deletions(-) - ---- a/include/unwind-cxx.h -+++ b/include/unwind-cxx.h -@@ -1,5 +1,5 @@ - // -*- C++ -*- Exception handling and frame unwind runtime interface routines. --// Copyright (C) 2001 Free Software Foundation, Inc. -+// Copyright (C) 2001-2015 Free Software Foundation, Inc. - // - // This file is part of GCC. - // -@@ -13,6 +13,10 @@ - // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - // GNU General Public License for more details. - // -+// Under Section 7 of GPL version 3, you are granted additional -+// permissions described in the GCC Runtime Library Exception, version -+// 3.1, as published by the Free Software Foundation. -+// - // You should have received a copy of the GNU General Public License - // along with GCC; see the file COPYING. If not, write to - // the Free Software Foundation, 59 Temple Place - Suite 330, -@@ -40,6 +44,12 @@ - #include - #include "unwind.h" - -+// Original unwind-cxx.h also includes bits/atomic_word.h which is CPU-specific, -+// but always defines _Atomic_word as typedef int . -+// Only thing that differs is memory-barrier macroses. -+typedef int _Atomic_word; -+ -+ - #pragma GCC visibility push(default) - - namespace __cxxabiv1 -@@ -79,6 +89,13 @@ struct __cxa_exception - _Unwind_Exception unwindHeader; - }; - -+struct __cxa_refcounted_exception -+{ -+ // Manage this header. -+ _Atomic_word referenceCount; -+ // __cxa_exception must be last, and no padding can be after it. -+ __cxa_exception exc; -+}; - - // A dependent C++ exception object consists of a header, which is a wrapper - // around an unwind object header with additional C++ specific information, -@@ -210,6 +227,21 @@ __get_exception_header_from_ue (_Unwind_ - return reinterpret_cast<__cxa_exception *>(exc + 1) - 1; - } - -+// Acquire the C++ refcounted exception header from the C++ object. -+static inline __cxa_refcounted_exception * -+__get_refcounted_exception_header_from_obj (void *ptr) -+{ -+ return reinterpret_cast<__cxa_refcounted_exception *>(ptr) - 1; -+} -+ -+// Acquire the C++ refcounted exception header from the generic exception -+// header. -+static inline __cxa_refcounted_exception * -+__get_refcounted_exception_header_from_ue (_Unwind_Exception *exc) -+{ -+ return reinterpret_cast<__cxa_refcounted_exception *>(exc + 1) - 1; -+} -+ - } /* namespace __cxxabiv1 */ - - #pragma GCC visibility pop ---- a/src/eh_alloc.cpp -+++ b/src/eh_alloc.cpp -@@ -30,16 +30,16 @@ extern "C" void * __cxa_allocate_excepti - void *retval; - //The sizeof crap is required by Itanium ABI because we need to provide space for - //accounting information which is implementaion (gcc) specified -- retval = malloc (thrown_size + sizeof(__cxa_exception)); -+ retval = malloc (thrown_size + sizeof(__cxa_refcounted_exception)); - if (0 == retval){ - std::terminate(); - } -- memset (retval, 0, sizeof(__cxa_exception)); -- return (void *)((unsigned char *)retval + sizeof(__cxa_exception)); -+ memset (retval, 0, sizeof(__cxa_refcounted_exception)); -+ return (void *)((unsigned char *)retval + sizeof(__cxa_refcounted_exception)); - } - - extern "C" void __cxa_free_exception(void *vptr) throw(){ -- free( (char *)(vptr) - sizeof(__cxa_exception) ); -+ free( (char *)(vptr) - sizeof(__cxa_refcounted_exception) ); - } - - diff --git a/package/libs/uclibc++/patches/040-delete-c++14.patch b/package/libs/uclibc++/patches/040-delete-c++14.patch deleted file mode 100644 index f48a78f0a4..0000000000 --- a/package/libs/uclibc++/patches/040-delete-c++14.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/src/del_op.cpp -+++ b/src/del_op.cpp -@@ -24,3 +24,7 @@ - _UCXXEXPORT void operator delete(void* ptr) throw(){ - free(ptr); - } -+ -+_UCXXEXPORT void operator delete(void* ptr, size_t size) throw(){ -+ free(ptr); -+} ---- a/src/del_opv.cpp -+++ b/src/del_opv.cpp -@@ -24,3 +24,7 @@ - _UCXXEXPORT void operator delete[](void * ptr) throw(){ - free(ptr); - } -+ -+_UCXXEXPORT void operator delete[](void * ptr, size_t size) throw(){ -+ free(ptr); -+} diff --git a/package/libs/uclibc++/patches/050-Bugfix-erase-on-derived-__base_associative.patch b/package/libs/uclibc++/patches/050-Bugfix-erase-on-derived-__base_associative.patch deleted file mode 100644 index 2ddb8a984e..0000000000 --- a/package/libs/uclibc++/patches/050-Bugfix-erase-on-derived-__base_associative.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 946b29e62927eadfc4e87f27b8d30e5974b78c4c Mon Sep 17 00:00:00 2001 -From: Ben Kelly -Date: Mon, 6 Feb 2017 13:08:25 +0200 -Subject: [PATCH] Bugfix erase() on derived __base_associative - -When calling erase() on a containers derived from __base_associative -(e.g. multimap) and providing a pair of iterators a segfault will -occur. - -Example code to reproduce: - - typedef std::multimap testmap; - testmap t; - t.insert(std::pair(1, 1)); - t.insert(std::pair(2, 1)); - t.insert(std::pair(3, 1)); - t.erase(t.begin(), t.end()); - -Signed-off-by: Ben Kelly ---- - include/associative_base | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/include/associative_base b/include/associative_base -index 27ae0ef..be8b27f 100644 ---- a/include/associative_base -+++ b/include/associative_base -@@ -200,8 +200,7 @@ public: - } - void erase(iterator first, iterator last){ - while(first != last){ -- backing.erase(first.base_iterator()); -- ++first; -+ first = backing.erase(first.base_iterator()); - } - } - --- -2.7.4 - -- 2.30.2