diff options
author | Dirk Mueller <dmueller@suse.de> | 2007-03-09 16:16:35 +0000 |
---|---|---|
committer | Dirk Mueller <mueller@gcc.gnu.org> | 2007-03-09 16:16:35 +0000 |
commit | 63a0874077b3325c2b3cc47401d8bfe916d8f128 (patch) | |
tree | 0678efcbaa9704baaeb7ec0f167caf43462406c8 /gcc/cp | |
parent | 0de2ae02735c71f5318af4486444d33c26fc211a (diff) | |
download | gcc-63a0874077b3325c2b3cc47401d8bfe916d8f128.zip gcc-63a0874077b3325c2b3cc47401d8bfe916d8f128.tar.gz gcc-63a0874077b3325c2b3cc47401d8bfe916d8f128.tar.bz2 |
re PR c/17946 (wanted: warning for "a && MASK" when "a & MASK" was probably intended)
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.
From-SVN: r122751
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 3872284..8d0ba18 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 3514e62..fb4609e 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: |