From 209042e6134df01869271b00985b8e5f51771554 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Tue, 17 Jan 2017 00:14:52 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/gimple-ssa-sprintf.c | 26 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ef73ce180e..ead236ff5fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-01-16 Martin Sebor + + PR tree-optimization/78608 + * gimple-ssa-sprintf.c (tree_digits): Avoid negating TYPE_MIN. + 2017-01-16 Jeff Law Revert: diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index 262857c64de..76e851231d6 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; -- 2.30.2