aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2007-03-04 23:29:41 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2007-03-04 23:29:41 +0000
commitf73fe417bc5556b2ab098e22cb6436b9b26c0577 (patch)
treeb5345e046ddd0c7cfef6c82973f5e694a3fbb99e /gcc
parentaf13a7a6ec9a50c39948ee5631a47c29c84fc6d1 (diff)
downloadgcc-f73fe417bc5556b2ab098e22cb6436b9b26c0577.zip
gcc-f73fe417bc5556b2ab098e22cb6436b9b26c0577.tar.gz
gcc-f73fe417bc5556b2ab098e22cb6436b9b26c0577.tar.bz2
re PR other/30465 (Duplicated overflow warning)
2007-03-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR other/30465 * c-common.c (convert_and_check): Don't give warnings for conversion if 'expr' already overflowed. testsuite/ * gcc.dg/multiple-overflow-warn-3.c: New. * g++.dg/warn/multiple-overflow-warn-3.C: New. From-SVN: r122534
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-common.c31
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C12
-rw-r--r--gcc/testsuite/gcc.dg/multiple-overflow-warn-3.c12
5 files changed, 50 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2646f34..47b83c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+
+ PR other/30465
+ * c-common.c (convert_and_check): Don't give warnings for
+ conversion if 'expr' already overflowed.
+
2007-03-04 Roger Sayle <roger@eyesopen.com>
PR middle-end/30744
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 6ea3800..523ef46 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -1250,10 +1250,9 @@ convert_and_check (tree type, tree expr)
result = convert (type, expr);
- if (skip_evaluation)
+ if (skip_evaluation || TREE_OVERFLOW_P (expr))
return result;
-
if (TREE_CODE (expr) == INTEGER_CST
&& (TREE_CODE (type) == INTEGER_TYPE
|| TREE_CODE (type) == ENUMERAL_TYPE)
@@ -1274,21 +1273,19 @@ convert_and_check (tree type, tree expr)
else if (warn_conversion)
conversion_warning (type, expr);
}
- else
- {
- if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
- warning (OPT_Woverflow,
- "overflow in implicit constant conversion");
- /* No warning for converting 0x80000000 to int. */
- else if (pedantic
- && (TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE
- || TYPE_PRECISION (TREE_TYPE (expr))
- != TYPE_PRECISION (type)))
- warning (OPT_Woverflow,
- "overflow in implicit constant conversion");
- else if (warn_conversion)
- conversion_warning (type, expr);
- }
+ else if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
+ warning (OPT_Woverflow,
+ "overflow in implicit constant conversion");
+ /* No warning for converting 0x80000000 to int. */
+ else if (pedantic
+ && (TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE
+ || TYPE_PRECISION (TREE_TYPE (expr))
+ != TYPE_PRECISION (type)))
+ warning (OPT_Woverflow,
+ "overflow in implicit constant conversion");
+
+ else if (warn_conversion)
+ conversion_warning (type, expr);
}
else if (TREE_CODE (result) == INTEGER_CST && TREE_OVERFLOW (result))
warning (OPT_Woverflow,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 258f2f2..84c2d21 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-03-04 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+
+ PR other/30465
+ * gcc.dg/multiple-overflow-warn-3.c: New.
+ * g++.dg/warn/multiple-overflow-warn-3.C: New.
+
2007-03-04 Simon Martin <simartin@users.sourceforge.net>
PR c++/30895
diff --git a/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C
new file mode 100644
index 0000000..491f7af
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C
@@ -0,0 +1,12 @@
+/* PR 30465 : Test for duplicated warnings in a conversion. */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow" } */
+
+wchar_t
+g (void)
+{
+ wchar_t wc = ((wchar_t)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */
+ /* { dg-warning "overflow" "" { target *-*-* } 8 } */
+ return wc;
+}
+
diff --git a/gcc/testsuite/gcc.dg/multiple-overflow-warn-3.c b/gcc/testsuite/gcc.dg/multiple-overflow-warn-3.c
new file mode 100644
index 0000000..afb4e51
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/multiple-overflow-warn-3.c
@@ -0,0 +1,12 @@
+/* PR 30465 : Test for duplicated warnings in a conversion. */
+/* { dg-do compile } */
+/* { dg-options "-Woverflow" } */
+
+short int
+g (void)
+{
+ short int wc = ((short int)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */
+ /* { dg-warning "overflow" "" { target *-*-* } 8 } */
+ return wc;
+}
+