Commit e506dc87 by Jeff Law Committed by Jeff Law

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
parent 04946c6b
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
PR middle-end/82123 PR middle-end/82123
PR tree-optimization/81592 PR tree-optimization/81592
PR middle-end/79257 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 * gimple-ssa-sprintf.c (get_int_range): Query EVRP range analyzer for
range data rather than using global data. range data rather than using global data.
* gimple-ssa-sprintf.c (get_int_range): Accept vr_values parameter * 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) ...@@ -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 /* Try to determine the range of values of the integer argument
(range information is not available for pointers). */ (range information is not available for pointers). */
wide_int min, max; value_range *vr = vr_values->get_value_range (arg);
enum value_range_type range_type = get_range_info (arg, &min, &max); if (vr->type == VR_RANGE
if (range_type == VR_RANGE) && TREE_CODE (vr->min) == INTEGER_CST
&& TREE_CODE (vr->max) == INTEGER_CST)
{ {
argmin = wide_int_to_tree (argtype, min); argmin = vr->min;
argmax = wide_int_to_tree (argtype, max); argmax = vr->max;
/* Set KNOWNRANGE if the argument is in a known subrange /* Set KNOWNRANGE if the argument is in a known subrange
of the directive's type and neither width nor precision 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) ...@@ -1469,11 +1470,12 @@ format_integer (const directive &dir, tree arg, vr_values *vr_values)
res.argmin = argmin; res.argmin = argmin;
res.argmax = argmax; 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. */ /* 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 /* The argument here may be the result of promoting the actual
argument to int. Try to determine the type of the actual argument to int. Try to determine the type of the actual
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
PR middle-end/82123 PR middle-end/82123
PR tree-optimization/81592 PR tree-optimization/81592
PR middle-end/79257 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. * gcc.dg/builtin-unreachable-6.c: Turn off VRP.
2018-02-20 Jakub Jelinek <jakub@redhat.com> 2018-02-20 Jakub Jelinek <jakub@redhat.com>
......
/* { 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;
}
/* { 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);
}
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