gimple-ssa-sprintf.c (format_floating): Test HAVE_XFmode and HAVE_DFmode before using...
authorMartin Sebor <msebor@redhat.com>
Thu, 26 Jan 2017 23:37:17 +0000 (23:37 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Thu, 26 Jan 2017 23:37:17 +0000 (16:37 -0700)
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
gcc/gimple-ssa-sprintf.c

index 86c4a0d98466841a2ecbe721affa9c743dbe0ce6..ac9a89f7ba882bad0f2ab5a7ff7a26e0539a6877 100644 (file)
@@ -1,5 +1,10 @@
 2017-01-26  Martin Sebor  <msebor@redhat.com>
 
+       * 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.
index 61eafacfb80e084ce78cdd413959843d3d5e58fd..65144acebf56d5ba03bffb3b2515e3fcd0720d64 100644 (file)
@@ -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)
        {