diff options
author | mueller <mueller@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-09 16:16:35 +0000 |
---|---|---|
committer | mueller <mueller@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-09 16:16:35 +0000 |
commit | b13d1547d45740ef3ac2096ff5555a56babc9be5 (patch) | |
tree | 0678efcbaa9704baaeb7ec0f167caf43462406c8 /gcc/cp | |
parent | 565b6b353b1dd56268fa3f241f2848fe6c72c90c (diff) | |
download | gcc-b13d1547d45740ef3ac2096ff5555a56babc9be5.tar.gz |
2007-03-09 Dirk Mueller <dmueller@suse.de>
PR c++/17946
* doc/invoke.texi (-Wlogical-op): Document.
* common.opt (-Wlogical-op): New.
* c-common.h (warn_logical_operator): Declare.
* c-common.c (warn_logical_operator): Define.
* c-typeck.c (parser_build_binary_op): Call
warn_logical_operator.
* cp/call.c (build_new_op): Call warn_logical_operator.
* testsuite/gcc.dg/Wlogical-op-1.c: New.
* testsuite/g++.dg/warn/Wlogical-op-1.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122751 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/call.c | 21 |
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 38722840a8a..8d0ba18a79c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2007-03-09 Dirk Mueller <dmueller@suse.de> + + * cp/call.c (build_new_op): Call warn_logical_operator. + 2007-03-08 Volker Reichelt <reichelt@netcologne.de> PR c++/30852 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 3514e62324b..fb4609edf7b 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3694,6 +3694,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, void *p; bool strict_p; bool any_viable_p; + bool expl_eq_arg1 = false; if (error_operand_p (arg1) || error_operand_p (arg2) @@ -3723,6 +3724,12 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, case CALL_EXPR: return build_object_call (arg1, arg2); + case TRUTH_ORIF_EXPR: + case TRUTH_ANDIF_EXPR: + case TRUTH_AND_EXPR: + case TRUTH_OR_EXPR: + if (COMPARISON_CLASS_P (arg1)) + expl_eq_arg1 = true; default: break; } @@ -3930,6 +3937,12 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, conv = conv->u.next; arg3 = convert_like (conv, arg3); } + + if (!expl_eq_arg1) + { + warn_logical_operator (code, arg1, arg2); + expl_eq_arg1 = true; + } } } @@ -3950,6 +3963,12 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, case INDIRECT_REF: return build_indirect_ref (arg1, "unary *"); + case TRUTH_ANDIF_EXPR: + case TRUTH_ORIF_EXPR: + case TRUTH_AND_EXPR: + case TRUTH_OR_EXPR: + if (!expl_eq_arg1) + warn_logical_operator (code, arg1, arg2); case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: @@ -3968,8 +3987,6 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3, case BIT_AND_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR: - case TRUTH_ANDIF_EXPR: - case TRUTH_ORIF_EXPR: return cp_build_binary_op (code, arg1, arg2); case UNARY_PLUS_EXPR: |