summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-09 00:08:58 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-09 00:08:58 +0000
commit88e5dbc16d4d080e13d995ad9a8c5809c884ebff (patch)
tree21308cd93e08a946d06dcc64d13ea52053980587 /libstdc++-v3
parentbdd661e0f320faf78ce306860817d65a7700ef0c (diff)
downloadgcc-88e5dbc16d4d080e13d995ad9a8c5809c884ebff.tar.gz
2005-04-08 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/20909 * include/bits/locale_facets.tcc (num_put<>::_M_insert_float): Don't even try to group numbers like 2e20, i.e., no decimal point, scientific notation. * testsuite/22_locale/num_put/put/char/20909.cc: New. * testsuite/22_locale/num_put/put/wchar_t/20909.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97873 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/bits/locale_facets.tcc6
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_put/put/char/20909.cc79
-rw-r--r--libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/20909.cc79
4 files changed, 172 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index fc8b84a89b0..ae6ebbafe95 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2005-04-08 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/20909
+ * include/bits/locale_facets.tcc (num_put<>::_M_insert_float):
+ Don't even try to group numbers like 2e20, i.e., no decimal
+ point, scientific notation.
+ * testsuite/22_locale/num_put/put/char/20909.cc: New.
+ * testsuite/22_locale/num_put/put/wchar_t/20909.cc: Likewise.
+
2005-04-08 Kelley Cook <kcook@gcc.gnu.org>
* acinclude.m4 (GLIBCXX_ENABLE_SYMVERS): Define _GLIBCXX_ASM_SYMVER.
diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc
index ae3a102ff44..0301781a2c3 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -1153,7 +1153,11 @@ namespace std
__ws[__p - __ws] = __dec;
// Add grouping, if necessary.
- if (__lc->_M_use_grouping)
+ // N.B. Make sure to not group things like 2e20, i.e., no decimal
+ // point, scientific notation.
+ if (__lc->_M_use_grouping
+ && (__p || __len < 3 || (__cs[1] != 'e' && __cs[2] != 'e'
+ && __cs[1] != 'E' && __cs[2] != 'E')))
{
// Grouping can add (almost) as many separators as the
// number of digits, but no more.
diff --git a/libstdc++-v3/testsuite/22_locale/num_put/put/char/20909.cc b/libstdc++-v3/testsuite/22_locale/num_put/put/char/20909.cc
new file mode 100644
index 00000000000..abb2e5ced61
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_put/put/char/20909.cc
@@ -0,0 +1,79 @@
+// 2005-04-08 Paolo Carlini <pcarlini@suse.de>
+
+// Copyright (C) 2005 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.2.2.2.1 num_put members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/20909
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ // A locale that expects grouping.
+ locale loc_de = __gnu_test::try_named_locale("de_DE");
+
+ const string empty;
+ string result;
+
+ ostringstream oss;
+ oss.imbue(loc_de);
+ const num_put<char>& np = use_facet<num_put<char> >(oss.getloc());
+
+ double d0 = 2e20;
+ double d1 = -2e20;
+
+ oss.str(empty);
+ oss.clear();
+ np.put(oss.rdbuf(), oss, '*', d0);
+ result = oss.str();
+ VERIFY( result == "2e+20" );
+
+ oss.str(empty);
+ oss.clear();
+ np.put(oss.rdbuf(), oss, '*', d1);
+ result = oss.str();
+ VERIFY( result == "-2e+20" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::uppercase);
+ np.put(oss.rdbuf(), oss, '*', d0);
+ result = oss.str();
+ VERIFY( result == "2E+20" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showpos);
+ np.put(oss.rdbuf(), oss, '*', d0);
+ result = oss.str();
+ VERIFY( result == "+2E+20" );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
+
+
diff --git a/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/20909.cc b/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/20909.cc
new file mode 100644
index 00000000000..226971853c4
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_put/put/wchar_t/20909.cc
@@ -0,0 +1,79 @@
+// 2005-04-08 Paolo Carlini <pcarlini@suse.de>
+
+// Copyright (C) 2005 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.2.2.2.1 num_put members
+
+#include <locale>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+// libstdc++/20909
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ // A locale that expects grouping.
+ locale loc_de = __gnu_test::try_named_locale("de_DE");
+
+ const wstring empty;
+ wstring result;
+
+ wostringstream oss;
+ oss.imbue(loc_de);
+ const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc());
+
+ double d0 = 2e20;
+ double d1 = -2e20;
+
+ oss.str(empty);
+ oss.clear();
+ np.put(oss.rdbuf(), oss, L'*', d0);
+ result = oss.str();
+ VERIFY( result == L"2e+20" );
+
+ oss.str(empty);
+ oss.clear();
+ np.put(oss.rdbuf(), oss, L'*', d1);
+ result = oss.str();
+ VERIFY( result == L"-2e+20" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::uppercase);
+ np.put(oss.rdbuf(), oss, L'*', d0);
+ result = oss.str();
+ VERIFY( result == L"2E+20" );
+
+ oss.str(empty);
+ oss.clear();
+ oss.setf(ios::showpos);
+ np.put(oss.rdbuf(), oss, L'*', d0);
+ result = oss.str();
+ VERIFY( result == L"+2E+20" );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
+
+