From 9976a81057ee36684234cc615df137663494af0d Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Thu, 26 Jan 2017 23:37:17 +0000 Subject: [PATCH] gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and HAVE_DFmode before using XFmode or DFmode. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit gcc/ChangeLog: * gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and HAVE_DFmode before using XFmode or DFmode. (parse_directive): Avoid using the z length modifier to avoid the ISO C++98 does not support the ‘z’ gnu_printf length modifier. From-SVN: r244957 --- gcc/ChangeLog | 5 +++++ gcc/gimple-ssa-sprintf.c | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86c4a0d9846..ac9a89f7ba8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2017-01-26 Martin Sebor + * gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and + HAVE_DFmode before using XFmode or DFmode. + (parse_directive): Avoid using the z length modifier to avoid + the ISO C++98 does not support the ‘z’ gnu_printf length modifier. + PR middle-end/78703 * gimple-ssa-sprintf.c (adjust_for_width_or_precision): Change to accept adjustment as an array. diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index 61eafacfb80..65144acebf5 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -1686,11 +1686,19 @@ format_floating (const directive &dir, tree arg) prec[0] = -1; if (prec[1] < 0) { +#ifdef HAVE_XFmode + /* When L is specified use long double, otherwise double. */ unsigned fmtprec = (dir.modifier == FMT_LEN_L ? REAL_MODE_FORMAT (XFmode)->p : REAL_MODE_FORMAT (DFmode)->p); - +#elif defined HAVE_DFmode + /* No long double support, use double precision for both. */ + unsigned fmtprec = REAL_MODE_FORMAT (DFmode)->p; +#else + /* No long double or double support. */ + unsigned fmtprec = 0; +#endif /* The precision of the IEEE 754 double format is 53. The precision of all other GCC binary double formats is 56 or less. */ @@ -2706,10 +2714,11 @@ parse_directive (pass_sprintf_length::call_info &info, if (dump_file) { - fprintf (dump_file, " Directive %u at offset %zu: \"%.*s\", " - "length = %zu\n", - dir.dirno, (size_t)(dir.beg - info.fmtstr), - (int)dir.len, dir.beg, dir.len); + fprintf (dump_file, " Directive %u at offset %llu: \"%.*s\", " + "length = %llu\n", + dir.dirno, + (unsigned long long)(size_t)(dir.beg - info.fmtstr), + (int)dir.len, dir.beg, (unsigned long long)dir.len); } return len - !*str; @@ -3029,8 +3038,8 @@ parse_directive (pass_sprintf_length::call_info &info, if (dump_file) { - fprintf (dump_file, " Directive %u at offset %zu: \"%.*s\"", - dir.dirno, (size_t)(dir.beg - info.fmtstr), + fprintf (dump_file, " Directive %u at offset %llu: \"%.*s\"", + dir.dirno, (unsigned long long)(size_t)(dir.beg - info.fmtstr), (int)dir.len, dir.beg); if (star_width) { -- 2.30.2