Commit 30dc6ee9 by Martin Sebor Committed by Martin Sebor

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
parent c5a13998
2016-09-28 Martin Sebor <msebor@redhat.com> 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 PR bootstrap/77753
* varasm.c (assemble_addr_to_section): Increase local buffer size. * varasm.c (assemble_addr_to_section): Increase local buffer size.
......
...@@ -869,7 +869,14 @@ format_integer (const conversion_spec &spec, tree arg) ...@@ -869,7 +869,14 @@ format_integer (const conversion_spec &spec, tree arg)
break; break;
default: 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 /* 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) ...@@ -1147,6 +1154,7 @@ format_floating (const conversion_spec &spec, int width, int prec)
switch (spec.modifier) switch (spec.modifier)
{ {
case FMT_LEN_l:
case FMT_LEN_none: case FMT_LEN_none:
type = double_type_node; type = double_type_node;
break; break;
...@@ -1162,7 +1170,14 @@ format_floating (const conversion_spec &spec, int width, int prec) ...@@ -1162,7 +1170,14 @@ format_floating (const conversion_spec &spec, int width, int prec)
break; break;
default: 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. */ /* 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) ...@@ -1248,7 +1263,14 @@ format_floating (const conversion_spec &spec, int width, int prec)
} }
default: 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) if (0 < width)
......
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> 2016-09-28 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR c++/77748 PR c++/77748
......
...@@ -866,6 +866,8 @@ void test_sprintf_chk_z_const (void) ...@@ -866,6 +866,8 @@ void test_sprintf_chk_z_const (void)
void test_sprintf_chk_e_const (void) void test_sprintf_chk_e_const (void)
{ {
T (-1, "%E", 0.0); 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 ( 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" } */ T ( 1, "%E", 1.0); /* { dg-warning "into a region" } */
...@@ -1076,6 +1078,8 @@ void test_sprintf_chk_int_nonconst (int a) ...@@ -1076,6 +1078,8 @@ void test_sprintf_chk_int_nonconst (int a)
void test_sprintf_chk_e_nonconst (double d) void test_sprintf_chk_e_nonconst (double d)
{ {
T (-1, "%E", 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 "writing between 12 and 14 bytes into a region of size 0" } */
T ( 0, "%e", d); /* { dg-warning "into a region" } */ T ( 0, "%e", d); /* { dg-warning "into a region" } */
T ( 1, "%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) ...@@ -1107,6 +1111,8 @@ void test_sprintf_chk_e_nonconst (double d)
void test_sprintf_chk_f_nonconst (double d) void test_sprintf_chk_f_nonconst (double d)
{ {
T (-1, "%F", 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 ( 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" } */ T ( 1, "%F", d); /* { dg-warning "into a region" } */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment