aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2016-09-28 16:13:12 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2016-09-28 10:13:12 -0600
commit30dc6ee97026f393813f0a31f2294ac1d0898c56 (patch)
treecffe601ef84e093361c9259fe2b62b76300fdd8f
parentc5a13998704d9dc8c5c9bf9467699a1af17ab0b4 (diff)
downloadgcc-30dc6ee97026f393813f0a31f2294ac1d0898c56.zip
gcc-30dc6ee97026f393813f0a31f2294ac1d0898c56.tar.gz
gcc-30dc6ee97026f393813f0a31f2294ac1d0898c56.tar.bz2
PR middle-end/77683 - ICE on %lf directive in format_floating in
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/gimple-ssa-sprintf.c28
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c6
4 files changed, 44 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3a1e6764..13d0efa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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
* varasm.c (assemble_addr_to_section): Increase local buffer size.
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index 2e15149..f7382f1 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b942bd6..0980c54 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
index e11c279..3a17189 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-1.c
@@ -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" } */