aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2011-10-11 10:57:40 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2011-10-11 10:57:40 +0000
commit7bc3074123c8df0a6b2219f21102fe16d56554c2 (patch)
treeaf6cc51f4876ec81b86bbe16b497e6e4e0cf52d8 /gcc
parentd42c1fcaf40ac128373702cf9786ed290e598a25 (diff)
downloadgcc-7bc3074123c8df0a6b2219f21102fe16d56554c2.zip
gcc-7bc3074123c8df0a6b2219f21102fe16d56554c2.tar.gz
gcc-7bc3074123c8df0a6b2219f21102fe16d56554c2.tar.bz2
re PR c++/33067 (Awkward long decimal expansion for double literal in error.)
2011-10-11 Paolo Carlini <paolo.carlini@oracle.com> PR c++/33067 * c-family/c-pretty-print.c (pp_c_floating_constant): Output max_digits10 (in the ISO C++ WG N1822 sense) decimal digits. From-SVN: r179797
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-family/c-pretty-print.c14
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd97d6d..e83c515 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-10-11 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/33067
+ * c-family/c-pretty-print.c (pp_c_floating_constant): Output
+ max_digits10 (in the ISO C++ WG N1822 sense) decimal digits.
+
2011-10-11 Richard Sandiford <richard.sandiford@linaro.org>
* modulo-sched.c: Fix comment typo. Mention the possibility
diff --git a/gcc/c-family/c-pretty-print.c b/gcc/c-family/c-pretty-print.c
index 53d39d6..9119561 100644
--- a/gcc/c-family/c-pretty-print.c
+++ b/gcc/c-family/c-pretty-print.c
@@ -1018,8 +1018,20 @@ pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
static void
pp_c_floating_constant (c_pretty_printer *pp, tree r)
{
+ const struct real_format *fmt
+ = REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (r)));
+
+ REAL_VALUE_TYPE floating_cst = TREE_REAL_CST (r);
+ bool is_decimal = floating_cst.decimal;
+
+ /* See ISO C++ WG N1822. Note: The fraction 643/2136 approximates
+ log10(2) to 7 significant digits. */
+ int max_digits10 = 2 + (is_decimal ? fmt->p : fmt->p * 643L / 2136);
+
real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
- sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
+ sizeof (pp_buffer (pp)->digit_buffer),
+ max_digits10, 1);
+
pp_string (pp, pp_buffer(pp)->digit_buffer);
if (TREE_TYPE (r) == float_type_node)
pp_character (pp, 'f');