From 7bc3074123c8df0a6b2219f21102fe16d56554c2 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 11 Oct 2011 10:57:40 +0000 Subject: [PATCH] re PR c++/33067 (Awkward long decimal expansion for double literal in error.) 2011-10-11 Paolo Carlini 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 --- gcc/ChangeLog | 6 ++++++ gcc/c-family/c-pretty-print.c | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd97d6d8858..e83c515eb52 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-10-11 Paolo Carlini + + 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 * 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 53d39d643d0..91195613ff1 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');