PR middle-end/77683 - ICE on %lf directive in format_floating in
authorMartin Sebor <msebor@redhat.com>
Wed, 28 Sep 2016 16:13:12 +0000 (16:13 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 28 Sep 2016 16:13:12 +0000 (10:13 -0600)
gcc/testsuite/ChangeLog:

PR middle-end/77683
* gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Add test cases.

gcc/ChangeLog:

PR middle-end/77683
* gimple-ssa-sprintf.c (format_integer): Fail gracefully when
length modifier is not expected.
(format_floating): Ignore l length modifier and fail gracefuly
when it isn't one of the other expected ones.

From-SVN: r240583

gcc/ChangeLog
gcc/gimple-ssa-sprintf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c

index 3a1e67645e452763113f243ad62e20837547cd90..13d0efa79d208c1c7784a51a6a469cbf99e126be 100644 (file)
@@ -1,3 +1,11 @@
+2016-09-28  Martin Sebor  <msebor@redhat.com>
+
+       PR middle-end/77683
+       * gimple-ssa-sprintf.c (format_integer): Fail gracefully when
+       length modifier is not expected.
+       (format_floating): Ignore l length modifier and fail gracefuly
+       when it isn't one of the other expected ones.
+
 2016-09-28  Martin Sebor  <msebor@redhat.com>
 
        PR bootstrap/77753
index 2e15149cda0ede6a436970fa891fb4fd136b2658..f7382f10eef53bb33ea89f9c13eff32d2cedadb8 100644 (file)
@@ -869,7 +869,14 @@ format_integer (const conversion_spec &spec, tree arg)
       break;
 
     default:
-      gcc_unreachable ();
+      {
+       fmtresult res = fmtresult ();
+       res.range.min = HOST_WIDE_INT_MAX;
+       res.range.max = HOST_WIDE_INT_MAX;
+       res.bounded = false;
+       res.constant = false;
+       return res;
+      }
     }
 
   /* The type of the argument to the directive, either deduced from
@@ -1147,6 +1154,7 @@ format_floating (const conversion_spec &spec, int width, int prec)
 
   switch (spec.modifier)
     {
+    case FMT_LEN_l:
     case FMT_LEN_none:
       type = double_type_node;
       break;
@@ -1162,7 +1170,14 @@ format_floating (const conversion_spec &spec, int width, int prec)
       break;
 
     default:
-      gcc_unreachable ();
+      {
+       fmtresult res = fmtresult ();
+       res.range.min = HOST_WIDE_INT_MAX;
+       res.range.max = HOST_WIDE_INT_MAX;
+       res.bounded = false;
+       res.constant = false;
+       return res;
+      }
     }
 
   /* The minimum and maximum number of bytes produced by the directive.  */
@@ -1248,7 +1263,14 @@ format_floating (const conversion_spec &spec, int width, int prec)
       }
 
     default:
-      gcc_unreachable ();
+      {
+       fmtresult res = fmtresult ();
+       res.range.min = HOST_WIDE_INT_MAX;
+       res.range.max = HOST_WIDE_INT_MAX;
+       res.bounded = false;
+       res.constant = false;
+       return res;
+      }
     }
 
   if (0 < width)
index b942bd65b7fceb73b17fdce7875425a4518a67d9..0980c5483d02745c765344d3dba7174db1cfdfb4 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-28  Martin Sebor  <msebor@redhat.com>
+
+       PR middle-end/77683
+       * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Add test cases.
+
 2016-09-28  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR c++/77748
index e11c2798a2ecdb5ed5bcc9b85b24baf24fcb0190..3a171893e81df452e38411cc39f2c55ce598ce73 100644 (file)
@@ -866,6 +866,8 @@ void test_sprintf_chk_z_const (void)
 void test_sprintf_chk_e_const (void)
 {
   T (-1, "%E",   0.0);
+  T (-1, "%lE",  0.0);
+
   T ( 0, "%E",   0.0);          /* { dg-warning "into a region" } */
   T ( 0, "%e",   0.0);          /* { dg-warning "into a region" } */
   T ( 1, "%E",   1.0);          /* { dg-warning "into a region" } */
@@ -1076,6 +1078,8 @@ void test_sprintf_chk_int_nonconst (int a)
 void test_sprintf_chk_e_nonconst (double d)
 {
   T (-1, "%E",          d);
+  T (-1, "%lE",         d);
+
   T ( 0, "%E",          d);           /* { dg-warning "writing between 12 and 14 bytes into a region of size 0" } */
   T ( 0, "%e",          d);           /* { dg-warning "into a region" } */
   T ( 1, "%E",          d);           /* { dg-warning "into a region" } */
@@ -1107,6 +1111,8 @@ void test_sprintf_chk_e_nonconst (double d)
 void test_sprintf_chk_f_nonconst (double d)
 {
   T (-1, "%F",          d);
+  T (-1, "%lF",         d);
+
   T ( 0, "%F",          d);           /* { dg-warning "into a region" } */
   T ( 0, "%f",          d);           /* { dg-warning "into a region" } */
   T ( 1, "%F",          d);           /* { dg-warning "into a region" } */