aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2017-07-10 21:21:51 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2017-07-10 15:21:51 -0600
commit9c582dbb57486afa5675217dd0cccf3ba5bea4eb (patch)
treed47b7b5eae64ee6e43db31eb4bbc5d91b92de41b /gcc
parentb2221d2bc678887616b5517c2e935480528556f0 (diff)
downloadgcc-9c582dbb57486afa5675217dd0cccf3ba5bea4eb.zip
gcc-9c582dbb57486afa5675217dd0cccf3ba5bea4eb.tar.gz
gcc-9c582dbb57486afa5675217dd0cccf3ba5bea4eb.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple-ssa-sprintf.c6
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-19.c62
4 files changed, 81 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f001c1a..1e671db 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-07-10 Martin Sebor <msebor@redhat.com>
+
+ 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 <vgupta@synopsys.com>
* config.gcc: Remove uclibc from arc target spec.
diff --git a/gcc/gimple-ssa-sprintf.c b/gcc/gimple-ssa-sprintf.c
index f43778b..644cf7e 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 9250bca..f3b325c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,15 @@
2017-07-10 Martin Sebor <msebor@redhat.com>
+ 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 <msebor@redhat.com>
+
PR other/81345
* gcc.dg/pr81345.c: New test.
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 0000000..e043938
--- /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 " }
+}