aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-07-18 13:13:11 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-07-18 13:13:11 +0000
commitc56e97274f164e704e7f13dfe53531ced3cb24ca (patch)
tree8af96e877c0c68e48efb2eedf1d2ebca4c93f1f9 /gcc
parenteb5926451a7873a62de7ef02cba9f671bad14b88 (diff)
downloadgcc-c56e97274f164e704e7f13dfe53531ced3cb24ca.zip
gcc-c56e97274f164e704e7f13dfe53531ced3cb24ca.tar.gz
gcc-c56e97274f164e704e7f13dfe53531ced3cb24ca.tar.bz2
PR c++/86190 - bogus -Wsign-conversion warning
PR c++/86190 - bogus -Wsign-conversion warning * typeck.c (cp_build_binary_op): Fix formatting. Add a warning sentinel. * g++.dg/warn/Wsign-conversion-3.C: New test. * g++.dg/warn/Wsign-conversion-4.C: New test. From-SVN: r262855
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wsign-conversion-3.C13
-rw-r--r--gcc/testsuite/g++.dg/warn/Wsign-conversion-4.C14
5 files changed, 45 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fa58699..738b179 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-18 Marek Polacek <polacek@redhat.com>
+
+ PR c++/86190 - bogus -Wsign-conversion warning
+ * typeck.c (cp_build_binary_op): Fix formatting. Add a warning
+ sentinel.
+
2018-07-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/59480, DR 136
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index ea4ce96..1335da5 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -5312,12 +5312,13 @@ cp_build_binary_op (location_t location,
if (short_compare)
{
- /* We call shorten_compare only for diagnostic-reason. */
- tree xop0 = fold_simple (op0), xop1 = fold_simple (op1),
- xresult_type = result_type;
+ /* We call shorten_compare only for diagnostics. */
+ tree xop0 = fold_simple (op0);
+ tree xop1 = fold_simple (op1);
+ tree xresult_type = result_type;
enum tree_code xresultcode = resultcode;
shorten_compare (location, &xop0, &xop1, &xresult_type,
- &xresultcode);
+ &xresultcode);
}
if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
@@ -5350,6 +5351,7 @@ cp_build_binary_op (location_t location,
otherwise, it will be given type RESULT_TYPE. */
if (! converted)
{
+ warning_sentinel w (warn_sign_conversion, short_compare);
if (TREE_TYPE (op0) != result_type)
op0 = cp_convert_and_check (result_type, op0, complain);
if (TREE_TYPE (op1) != result_type)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e1832f8..47aec4f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-18 Marek Polacek <polacek@redhat.com>
+
+ PR c++/86190 - bogus -Wsign-conversion warning
+ * g++.dg/warn/Wsign-conversion-3.C: New test.
+ * g++.dg/warn/Wsign-conversion-4.C: New test.
+
2018-07-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/59480, DR 136
diff --git a/gcc/testsuite/g++.dg/warn/Wsign-conversion-3.C b/gcc/testsuite/g++.dg/warn/Wsign-conversion-3.C
new file mode 100644
index 0000000..2c3fef3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wsign-conversion-3.C
@@ -0,0 +1,13 @@
+// PR c++/86190
+// { dg-options "-Wsign-conversion -Wsign-compare" }
+
+typedef unsigned long sz_t;
+sz_t s();
+bool f(int i) { return s() < (unsigned long) i; }
+bool f2(int i) { return s() < static_cast<unsigned long>(i); }
+bool f3(int i) { return s() < i; } // { dg-warning "comparison of integer expressions of different signedness" }
+bool f4(int i) { return s() < (long) i; } // { dg-warning "comparison of integer expressions of different signedness" }
+bool f5(short int i) { return s() < (int) i; } // { dg-warning "comparison of integer expressions of different signedness" }
+bool f6(signed char i) { return s() < (int) i; } // { dg-warning "comparison of integer expressions of different signedness" }
+bool f7(unsigned char i) { return s() < i; }
+bool f8(signed char i) { return s() < i; } // { dg-warning "comparison of integer expressions of different signedness" }
diff --git a/gcc/testsuite/g++.dg/warn/Wsign-conversion-4.C b/gcc/testsuite/g++.dg/warn/Wsign-conversion-4.C
new file mode 100644
index 0000000..40814b9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wsign-conversion-4.C
@@ -0,0 +1,14 @@
+// PR c++/86190
+// { dg-options "-Wsign-conversion -Wsign-compare" }
+
+typedef unsigned long size_t;
+
+struct vector {
+ typedef size_t size_type;
+ size_type size();
+};
+
+bool func(vector vec, int var)
+{
+ return vec.size() < static_cast<size_t>(var); // { dg-bogus "may change" }
+}