re PR middle-end/82123 (spurious -Wformat-overflow warning for converted vars)
PR middle-end/82123 PR tree-optimization/81592 PR middle-end/79257 * gimple-ssa-sprintf.c (format_integer): Query EVRP range analyzer for range data rather than using global data. * gcc.dg/pr81592.c: New test. * gcc.dg/pr82123.c: New test. From-SVN: r257857
This commit is contained in:
parent
04946c6b90
commit
e506dc87a0
@ -3,6 +3,8 @@
|
||||
PR middle-end/82123
|
||||
PR tree-optimization/81592
|
||||
PR middle-end/79257
|
||||
* gimple-ssa-sprintf.c (format_integer): Query EVRP range analyzer
|
||||
for range data rather than using global data.
|
||||
* gimple-ssa-sprintf.c (get_int_range): Query EVRP range analyzer for
|
||||
range data rather than using global data.
|
||||
* gimple-ssa-sprintf.c (get_int_range): Accept vr_values parameter
|
||||
|
@ -1451,12 +1451,13 @@ format_integer (const directive &dir, tree arg, vr_values *vr_values)
|
||||
{
|
||||
/* Try to determine the range of values of the integer argument
|
||||
(range information is not available for pointers). */
|
||||
wide_int min, max;
|
||||
enum value_range_type range_type = get_range_info (arg, &min, &max);
|
||||
if (range_type == VR_RANGE)
|
||||
value_range *vr = vr_values->get_value_range (arg);
|
||||
if (vr->type == VR_RANGE
|
||||
&& TREE_CODE (vr->min) == INTEGER_CST
|
||||
&& TREE_CODE (vr->max) == INTEGER_CST)
|
||||
{
|
||||
argmin = wide_int_to_tree (argtype, min);
|
||||
argmax = wide_int_to_tree (argtype, max);
|
||||
argmin = vr->min;
|
||||
argmax = vr->max;
|
||||
|
||||
/* Set KNOWNRANGE if the argument is in a known subrange
|
||||
of the directive's type and neither width nor precision
|
||||
@ -1469,11 +1470,12 @@ format_integer (const directive &dir, tree arg, vr_values *vr_values)
|
||||
res.argmin = argmin;
|
||||
res.argmax = argmax;
|
||||
}
|
||||
else if (range_type == VR_ANTI_RANGE)
|
||||
else if (vr->type == VR_ANTI_RANGE)
|
||||
{
|
||||
/* Handle anti-ranges if/when bug 71690 is resolved. */
|
||||
}
|
||||
else if (range_type == VR_VARYING)
|
||||
else if (vr->type == VR_VARYING
|
||||
|| vr->type == VR_UNDEFINED)
|
||||
{
|
||||
/* The argument here may be the result of promoting the actual
|
||||
argument to int. Try to determine the type of the actual
|
||||
|
@ -9,6 +9,8 @@
|
||||
PR middle-end/82123
|
||||
PR tree-optimization/81592
|
||||
PR middle-end/79257
|
||||
* gcc.dg/pr81592.c: New test.
|
||||
* gcc.dg/pr82123.c: New test.
|
||||
* gcc.dg/builtin-unreachable-6.c: Turn off VRP.
|
||||
|
||||
2018-02-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
20
gcc/testsuite/gcc.dg/pr81592.c
Normal file
20
gcc/testsuite/gcc.dg/pr81592.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wall -fno-strict-overflow -Wstrict-overflow=2 -fsanitize=signed-integer-overflow" } */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int proc_keys_show(long expiry, long now)
|
||||
{
|
||||
unsigned long timo;
|
||||
char xbuf[4];
|
||||
|
||||
if (now < expiry) {
|
||||
timo = expiry - now;
|
||||
if (timo < 60)
|
||||
sprintf(xbuf, "%lus", timo);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
12
gcc/testsuite/gcc.dg/pr82123.c
Normal file
12
gcc/testsuite/gcc.dg/pr82123.c
Normal file
@ -0,0 +1,12 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wformat-overflow=1" } */
|
||||
|
||||
void acpi_gpiochip_request_interrupt(unsigned short s)
|
||||
{
|
||||
char name[3];
|
||||
unsigned int pin = s;
|
||||
|
||||
if (pin <= 255)
|
||||
__builtin_sprintf(name, "%02X", pin);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user