aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2011-10-14 00:12:40 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2011-10-14 00:12:40 +0000
commitb78eebe4f5341119c51562a02d5e3dd8139eb3ab (patch)
tree54494d6e41b441194140f185e388540c8b867fe2
parent2598165f09a96f60aa53abebf931718a769b7cf2 (diff)
downloadgcc-b78eebe4f5341119c51562a02d5e3dd8139eb3ab.zip
gcc-b78eebe4f5341119c51562a02d5e3dd8139eb3ab.tar.gz
gcc-b78eebe4f5341119c51562a02d5e3dd8139eb3ab.tar.bz2
re PR libstdc++/50714 (codecvt_byname::codecvt::_M_c_locale_codecvt not initialized by destroyed)
2011-10-13 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/50714 * include/bits/codecvt.h (codecvt<>::codecvt(size_t)): Initialize _M_c_locale_codecvt member. * testsuite/22_locale/codecvt_byname/50714.cc: New. From-SVN: r179948
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/codecvt.h4
-rw-r--r--libstdc++-v3/testsuite/22_locale/codecvt_byname/50714.cc94
3 files changed, 104 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 31bf711..f550f8f 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/50714
+ * include/bits/codecvt.h (codecvt<>::codecvt(size_t)): Initialize
+ _M_c_locale_codecvt member.
+ * testsuite/22_locale/codecvt_byname/50714.cc: New.
+
2011-10-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50594
diff --git a/libstdc++-v3/include/bits/codecvt.h b/libstdc++-v3/include/bits/codecvt.h
index 2570f4c..f485c17 100644
--- a/libstdc++-v3/include/bits/codecvt.h
+++ b/libstdc++-v3/include/bits/codecvt.h
@@ -292,7 +292,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
explicit
codecvt(size_t __refs = 0)
- : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs) { }
+ : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs),
+ _M_c_locale_codecvt(0)
+ { }
explicit
codecvt(__c_locale __cloc, size_t __refs = 0);
diff --git a/libstdc++-v3/testsuite/22_locale/codecvt_byname/50714.cc b/libstdc++-v3/testsuite/22_locale/codecvt_byname/50714.cc
new file mode 100644
index 0000000..6c84be2
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/codecvt_byname/50714.cc
@@ -0,0 +1,94 @@
+// { dg-require-namedlocale "de_DE" }
+
+// Copyright (C) 2011 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <locale>
+
+#define mychar unsigned short
+
+namespace std
+{
+ template<> codecvt<mychar, char, mbstate_t>::~codecvt()
+ { }
+
+ template<>
+ codecvt<mychar, char, mbstate_t>::result
+ codecvt<mychar, char, mbstate_t>::
+ do_out(state_type&, const intern_type*, const intern_type*,
+ const intern_type*&, extern_type*, extern_type*,
+ extern_type*&) const
+ { return codecvt_base::ok; }
+
+ template<>
+ codecvt<mychar, char, mbstate_t>::result
+ codecvt<mychar, char, mbstate_t>::
+ do_in(state_type&, const extern_type*, const extern_type*,
+ const extern_type*&, intern_type*, intern_type*,
+ intern_type*&) const
+ { return codecvt_base::ok; }
+
+ template<>
+ codecvt<mychar, char, mbstate_t>::result
+ codecvt<mychar, char, mbstate_t>::
+ do_unshift(state_type&, extern_type*, extern_type*,
+ extern_type*&) const
+ { return noconv; }
+
+ template<>
+ int
+ codecvt<mychar, char, mbstate_t>::do_encoding() const
+ { return 0; }
+
+ template<>
+ bool
+ codecvt<mychar, char, mbstate_t>::do_always_noconv() const
+ { return false; }
+
+ template<>
+ int
+ codecvt<mychar, char, mbstate_t>::
+ do_length(state_type&, const extern_type*, const extern_type*,
+ size_t) const
+ { return 0; }
+
+ template<>
+ int
+ codecvt<mychar, char, mbstate_t>::do_max_length() const
+ { return 4; }
+}
+
+// libstdc++/50714
+void test01()
+{
+ using namespace std;
+
+ {
+ locale loc(locale::classic(),
+ new codecvt<mychar, char, mbstate_t>());
+ }
+ {
+ locale loc2(locale::classic(),
+ new codecvt_byname<mychar, char, mbstate_t>("de_DE"));
+ }
+}
+
+int main()
+{
+ test01();
+ return 0;
+}