diff options
author | Martin Sebor <msebor@redhat.com> | 2016-09-28 16:13:12 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2016-09-28 10:13:12 -0600 |
commit | 30dc6ee97026f393813f0a31f2294ac1d0898c56 (patch) | |
tree | cffe601ef84e093361c9259fe2b62b76300fdd8f /gcc/gimple-ssa-sprintf.c | |
parent | c5a13998704d9dc8c5c9bf9467699a1af17ab0b4 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/gimple-ssa-sprintf.c')
-rw-r--r-- | gcc/gimple-ssa-sprintf.c | 28 |
1 files changed, 25 insertions, 3 deletions
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) |