From: Martin Sebor Date: Mon, 10 Jul 2017 21:21:51 +0000 (+0000) Subject: PR tree-optimization/80397 - missing -Wformat-overflow with arguments of enum types X-Git-Tag: basepoints/gcc-9~6052 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9c582dbb57486afa5675217dd0cccf3ba5bea4eb;p=thirdparty%2Fgcc.git PR tree-optimization/80397 - missing -Wformat-overflow with arguments of enum types gcc/ChangeLog: PR tree-optimization/80397 * gimple-ssa-sprintf.c (format_integer): Use INTEGRAL_TYPE_P() instead of testing for equality to INTEGER_TYPE. gcc/testsuite/ChangeLog: PR tree-optimization/80397 * gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test. From-SVN: r250106 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f001c1a34733..1e671dba4767 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-07-10 Martin Sebor + + PR tree-optimization/80397 + * gimple-ssa-sprintf.c (format_integer): Use INTEGRAL_TYPE_P() + instead of testing for equality to INTEGER_TYPE. + 2017-07-10 Vineet Gupta * config.gcc: Remove uclibc from arc target spec. diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c index f43778bbcfcd..644cf7e33b1f 100644 --- a/gcc/gimple-ssa-sprintf.c +++ b/gcc/gimple-ssa-sprintf.c @@ -1407,7 +1407,7 @@ format_integer (const directive &dir, tree arg) return res; } - else if (TREE_CODE (TREE_TYPE (arg)) == INTEGER_TYPE + else if (INTEGRAL_TYPE_P (TREE_TYPE (arg)) || TREE_CODE (TREE_TYPE (arg)) == POINTER_TYPE) /* Determine the type of the provided non-constant argument. */ argtype = TREE_TYPE (arg); @@ -1427,7 +1427,7 @@ format_integer (const directive &dir, tree arg) if (arg && TREE_CODE (arg) == SSA_NAME - && TREE_CODE (argtype) == INTEGER_TYPE) + && INTEGRAL_TYPE_P (argtype)) { /* Try to determine the range of values of the integer argument (range information is not available for pointers). */ @@ -1472,7 +1472,7 @@ format_integer (const directive &dir, tree arg) if (code == NOP_EXPR) { tree type = TREE_TYPE (gimple_assign_rhs1 (def)); - if (TREE_CODE (type) == INTEGER_TYPE + if (INTEGRAL_TYPE_P (type) || TREE_CODE (type) == POINTER_TYPE) argtype = type; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9250bca46f24..f3b325c9f8d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2017-07-10 Martin Sebor + + PR tree-optimization/80397 + * gcc.dg/tree-ssa/builtin-sprintf-warn-17.c: New test. +diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c +index 2e62086..d63d5be 100644 +--- a/gcc/gimple-ssa-sprintf.c ++++ b/gcc/gimple-ssa-sprintf.c +@@ -1249,7 +1249,7 @@ format_integer (const directive &dir, tree arg) + 2017-07-10 Martin Sebor PR other/81345 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-19.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-19.c new file mode 100644 index 000000000000..e0439384dd75 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-19.c @@ -0,0 +1,62 @@ +/* PR tree-optimization/80397 - missing -Wformat-overflow with arguments + of enum types + { dg-do compile } + { dg-options "-O2 -Wall -Wformat-overflow=1 -ftrack-macro-expansion=0" } + { dg-require-effective-target int32plus } */ + +void sink (char*); + +long long integer_range (long long min, long long max) +{ + extern long long integer_value (void); + long long n = integer_value (); + return n < min || max < n ? min : n; +} + +typedef enum { i0, imax = __INT_MAX__ } Int; +typedef enum { ll0, llmax = __LONG_LONG_MAX__ } LLong; + +#define R(T, min, max) (T)integer_range (min, max) + +char buffer[1]; +#define T(fmt, ...) \ + __builtin_sprintf (buffer + 1, fmt, __VA_ARGS__), sink (buffer) + +void test_bool (_Bool b) +{ + T ("%hhi", b); // { dg-warning "writing 1 byte" } + T ( "%hi", b); // { dg-warning "writing 1 byte" } + T ( "%i", b); // { dg-warning "writing 1 byte" } +} + +void test_enum (void) +{ + T ("%hhi", R (Int, 1, 1)); // { dg-warning "writing 1 byte" } + T ("%hhi", R (Int, 1, 22)); // { dg-warning "between 1 and 2 bytes" } + + T ( "%hi", R (Int, 1, 2)); // { dg-warning "writing 1 " } + T ( "%hi", R (Int, 1, 22)); // { dg-warning "between 1 and 2 " } + T ( "%hi", R (Int, 22, 333)); // { dg-warning "between 2 and 3 " } + T ( "%hi", R (Int, 333, 4444)); // { dg-warning "between 3 and 4 " } + + T ( "%i", R (Int, 1, 1)); // { dg-warning "writing 1 " } + T ( "%i", R (Int, 1, 22)); // { dg-warning "between 1 and 2 " } + T ( "%i", R (Int, 22, 333)); // { dg-warning "between 2 and 3 " } + T ( "%i", R (Int, 333, 4444)); // { dg-warning "between 3 and 4 " } + T ( "%i", R (Int, 4444, 55555)); // { dg-warning "between 4 and 5 " } + +#if __LONG_MAX__ == __LONG_LONG_MAX__ +# define LLI "%li" +#else +# define LLI "%lli" +#endif + + T (LLI, R (LLong, 1, 1)); // { dg-warning "writing 1 " } + T (LLI, R (LLong, 1, 22)); // { dg-warning "between 1 and 2 " } + T (LLI, R (LLong, 22, 333)); // { dg-warning "between 2 and 3 " } + T (LLI, R (LLong, 333, 4444)); // { dg-warning "between 3 and 4 " } + T (LLI, R (LLong, 4444, 55555)); // { dg-warning "between 4 and 5 " } + + T (LLI, R (LLong, 4444, 1234567890)); // { dg-warning "between 4 and 10 " } + T (LLI, R (LLong, 4444, 12345678901)); // { dg-warning "between 4 and 11 " } +}