diff options
author | Marek Polacek <polacek@redhat.com> | 2018-07-18 13:13:11 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-07-18 13:13:11 +0000 |
commit | c56e97274f164e704e7f13dfe53531ced3cb24ca (patch) | |
tree | 8af96e877c0c68e48efb2eedf1d2ebca4c93f1f9 /gcc | |
parent | eb5926451a7873a62de7ef02cba9f671bad14b88 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wsign-conversion-3.C | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wsign-conversion-4.C | 14 |
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" } +} |