mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 04:10:29 +08:00
re PR c++/36921 (warning "comparison does not have mathematical meaning" is not correct for overloaded operators that do not return boolean)
PR c++/36921 * c-common.c (warn_about_parentheses): Remove ARG_UNUSED from arg_left. Don't warn about X<=Y<=Z if comparison's type isn't integral. * g++.dg/warn/pr36921.C: New. Co-Authored-By: Manuel López-Ibáñez <manu@gcc.gnu.org> From-SVN: r142849
This commit is contained in:
parent
3ce1b2de25
commit
fb3e178a78
@ -8059,7 +8059,7 @@ warn_array_subscript_with_type_char (tree index)
|
||||
|
||||
void
|
||||
warn_about_parentheses (enum tree_code code,
|
||||
enum tree_code code_left, tree ARG_UNUSED (arg_left),
|
||||
enum tree_code code_left, tree arg_left,
|
||||
enum tree_code code_right, tree arg_right)
|
||||
{
|
||||
if (!warn_parentheses)
|
||||
@ -8169,9 +8169,11 @@ warn_about_parentheses (enum tree_code code,
|
||||
default:
|
||||
if (TREE_CODE_CLASS (code) == tcc_comparison
|
||||
&& ((TREE_CODE_CLASS (code_left) == tcc_comparison
|
||||
&& code_left != NE_EXPR && code_left != EQ_EXPR)
|
||||
&& code_left != NE_EXPR && code_left != EQ_EXPR
|
||||
&& INTEGRAL_TYPE_P (TREE_TYPE (arg_left)))
|
||||
|| (TREE_CODE_CLASS (code_right) == tcc_comparison
|
||||
&& code_right != NE_EXPR && code_right != EQ_EXPR)))
|
||||
&& code_right != NE_EXPR && code_right != EQ_EXPR
|
||||
&& INTEGRAL_TYPE_P (TREE_TYPE (arg_right)))))
|
||||
warning (OPT_Wparentheses, "comparisons like %<X<=Y<=Z%> do not "
|
||||
"have their mathematical meaning");
|
||||
return;
|
||||
|
@ -1,3 +1,11 @@
|
||||
2008-12-20 Jakub Jelinek <jakub@redhat.com>
|
||||
Manuel López-Ibáñez <manu@gcc.gnu.org>
|
||||
|
||||
PR c++/36921
|
||||
* c-common.c (warn_about_parentheses): Remove ARG_UNUSED from
|
||||
arg_left. Don't warn about X<=Y<=Z if comparison's type isn't
|
||||
integral.
|
||||
|
||||
2008-12-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/38577
|
||||
|
@ -1,3 +1,9 @@
|
||||
2008-12-20 Jakub Jelinek <jakub@redhat.com>
|
||||
Manuel López-Ibáñez <manu@gcc.gnu.org>
|
||||
|
||||
PR c++/36921
|
||||
* g++.dg/warn/pr36921.C: New.
|
||||
|
||||
2008-12-19 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||
|
||||
* lib/target-supports.exp: Add *-*-rtems* to list
|
||||
|
27
gcc/testsuite/g++.dg/warn/pr36921.C
Normal file
27
gcc/testsuite/g++.dg/warn/pr36921.C
Normal file
@ -0,0 +1,27 @@
|
||||
/* PR 36921: comparison operator can be overloaded. Do not emit
|
||||
warnings in such case.
|
||||
{ dg-do compile }
|
||||
{ dg-options "-Wparentheses" }
|
||||
*/
|
||||
struct A {};
|
||||
A operator<(A, A) { return A(); }
|
||||
A operator>(A, A) { return A(); }
|
||||
A operator<=(A, A) { return A(); }
|
||||
A operator>=(A, A) { return A(); }
|
||||
A operator==(A, A) { return A(); }
|
||||
A operator!=(A, A) { return A(); }
|
||||
|
||||
int main() {
|
||||
A() < A() < A(); // should not emit warning
|
||||
1 < 2 < 3; // { dg-warning "mathematical meaning" "parentheses" }
|
||||
A() > A() > A(); // should not emit warning
|
||||
1 > 2 > 3; // { dg-warning "mathematical meaning" "parentheses" }
|
||||
A() <= A() <= A(); // should not emit warning
|
||||
1 <= 2 <= 3; // { dg-warning "mathematical meaning" "parentheses" }
|
||||
A() >= A() >= A(); // should not emit warning
|
||||
1 >= 2 >= 3; // { dg-warning "mathematical meaning" "parentheses" }
|
||||
|
||||
A() == A() < A (); // { dg-warning "suggest parentheses" "parentheses" }
|
||||
A() < A() != A (); // { dg-warning "suggest parentheses" "parentheses" }
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user