aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2017-01-17 00:14:52 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2017-01-16 17:14:52 -0700
commit209042e6134df01869271b00985b8e5f51771554 (patch)
tree03a1bb0b97bc037879fb4d8de2867702ae95f24a
parent26830c2facbde04517814464d4cd099a6fe1dd08 (diff)
downloadgcc-209042e6134df01869271b00985b8e5f51771554.zip
gcc-209042e6134df01869271b00985b8e5f51771554.tar.gz
gcc-209042e6134df01869271b00985b8e5f51771554.tar.bz2
PR tree-optimization/78608 - gimple-ssa-sprintf.c:570:17: runtime error: negation of -9223372036854775808 cannot be represented in type 'long int'
gcc/ChangeLog: * gimple-ssa-sprintf.c (tree_digits): Avoid negating TYPE_MIN. From-SVN: r244511
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimple-ssa-sprintf.c26
2 files changed, 21 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ef73ce..ead236f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-16 Martin Sebor <msebor@redhat.com>
+
+ PR tree-optimization/78608
+ * gimple-ssa-sprintf.c (tree_digits): Avoid negating TYPE_MIN.
+
2017-01-16 Jeff Law <law@redhat.com>
Revert:
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index 262857c..76e8512 100644
--- a/gcc/gimple-ssa-sprintf.c
+++ b/gcc/gimple-ssa-sprintf.c
@@ -577,16 +577,22 @@ tree_digits (tree x, int base, HOST_WIDE_INT prec, bool plus, bool prefix)
if (tree_fits_shwi_p (x))
{
HOST_WIDE_INT i = tree_to_shwi (x);
- if (i < 0)
- {
- absval = -i;
- res = 1;
- }
- else
- {
- absval = i;
- res = plus;
- }
+ if (HOST_WIDE_INT_MIN == i)
+ {
+ /* Avoid undefined behavior due to negating a minimum. */
+ absval = HOST_WIDE_INT_MAX;
+ res = 1;
+ }
+ else if (i < 0)
+ {
+ absval = -i;
+ res = 1;
+ }
+ else
+ {
+ absval = i;
+ res = plus;
+ }
}
else
return -1;