diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-10-11 10:57:40 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-11 10:57:40 +0000 |
commit | 7bc3074123c8df0a6b2219f21102fe16d56554c2 (patch) | |
tree | af6cc51f4876ec81b86bbe16b497e6e4e0cf52d8 /gcc | |
parent | d42c1fcaf40ac128373702cf9786ed290e598a25 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-pretty-print.c | 14 |
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'); |