aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2003-09-26 02:22:01 +0200
committerPaolo Carlini <paolo@gcc.gnu.org>2003-09-26 00:22:01 +0000
commit91675f9d250dc14fda5c708ca86afd77a16b78bb (patch)
treed30431ba3f6f30116cd7cdf6d5917466fb5bd031 /libstdc++-v3/testsuite
parent81a1dd18722933060d68626285e0fbc188846718 (diff)
downloadgcc-91675f9d250dc14fda5c708ca86afd77a16b78bb.zip
gcc-91675f9d250dc14fda5c708ca86afd77a16b78bb.tar.gz
gcc-91675f9d250dc14fda5c708ca86afd77a16b78bb.tar.bz2
re PR libstdc++/12352 (Exception safety problems in src/localename.cc)
2003-09-25 Paolo Carlini <pcarlini@unitus.it> PR libstdc++/12352 * src/localename.cc (locale::_Impl::_Impl(const _Impl&, size_t)): Don't leak if memory allocations for _M_facets, _M_caches, and _M_names fail. (locale::_Impl::_Impl(const char*, size_t)): Ditto. (locale::_Impl::_M_replace_categories(const _Impl*, category)): Ditto. (locale::_Impl::_M_install_facet(const locale::id*, const facet*)): Ditto. * include/bits/locale_classes.h (locale::locale(const locale&, _Facet*)): Don't leak memory. * testsuite/22_locale/locale/cons/12352.cc: New, from the PR. * src/localename.cc (locale::_Impl::_Impl(facet**, size_t, bool)): Qualify with std:: strcpy, tweak. * include/bits/locale_classes.h (locale::_Impl::_M_check_same_name): Qualify strcmp. From-SVN: r71808
Diffstat (limited to 'libstdc++-v3/testsuite')
-rw-r--r--libstdc++-v3/testsuite/22_locale/locale/cons/12352.cc124
1 files changed, 124 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/12352.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/12352.cc
new file mode 100644
index 0000000..4263959
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/locale/cons/12352.cc
@@ -0,0 +1,124 @@
+// Copyright (C) 2003 Free Software Foundation
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// 22.1.1.2 locale constructors and destructors [lib.locale.cons]
+
+#include <new>
+#include <locale>
+#include <cstdlib>
+#include <cstring>
+
+int times_to_fail = 0;
+
+void* allocate(std::size_t n)
+{
+ if (!times_to_fail--)
+ return 0;
+
+ void* ret = std::malloc(n ? n : 1);
+ if (ret)
+ std::memset(ret, 0xbc, n);
+ return ret;
+}
+
+void deallocate(void* p)
+{
+ if (p)
+ std::free(p);
+}
+
+void* operator new(std::size_t n) throw (std::bad_alloc)
+{
+ void* ret = allocate(n);
+ if (!ret)
+ throw std::bad_alloc();
+ return ret;
+}
+
+void* operator new[](std::size_t n) throw (std::bad_alloc)
+{
+ void* ret = allocate(n);
+ if (!ret)
+ throw std::bad_alloc();
+ return ret;
+}
+
+void operator delete(void* p) throw()
+{
+ deallocate(p);
+}
+
+void operator delete[](void* p) throw()
+{
+ deallocate(p);
+}
+
+void* operator new(std::size_t n, const std::nothrow_t&) throw()
+{
+ return allocate(n);
+}
+
+void* operator new[](std::size_t n, const std::nothrow_t&) throw()
+{
+ return allocate(n);
+}
+
+void operator delete(void* p, const std::nothrow_t&) throw()
+{
+ deallocate(p);
+}
+
+void operator delete[](void* p, const std::nothrow_t&) throw()
+{
+ deallocate(p);
+}
+
+// libstdc++/12352
+void test01(int iters)
+{
+ using namespace std;
+ bool test = true;
+
+ for (int j = 0; j < iters; ++j)
+ {
+ for (int i = 0; i < 100; ++i)
+ {
+ times_to_fail = i;
+ try
+ {
+ locale loc1("");
+ locale loc2(loc1, locale::classic(), locale::numeric);
+ }
+ catch (exception&)
+ {
+ }
+ }
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ int iters = 1;
+ if (argc > 1)
+ iters = std::atoi(argv[1]);
+ if (iters < 1)
+ iters = 1;
+ test01(iters);
+
+ return 0;
+}