aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Triplett <josh@freedesktop.org>2008-12-18 01:33:19 +0300
committerAlexey Zaytsev <alexey.zaytsev@gmail.com>2008-12-18 21:11:00 +0300
commite34179b2e784ee6b4de195e69d5898127015545a (patch)
treed83ff141ebbb8de259f5afebca6c89193482ecf3 /evaluate.c
parentAdd enum member list to the parent (diff)
downloadsparse-e34179b2e784ee6b4de195e69d5898127015545a.tar.gz
sparse-e34179b2e784ee6b4de195e69d5898127015545a.tar.bz2
sparse-e34179b2e784ee6b4de195e69d5898127015545a.zip
Expand "dubious !x & y" handling to other combinations of !, &, and |.
Signed-off-by: Josh Triplett <josh@freedesktop.org>
Diffstat (limited to 'evaluate.c')
-rw-r--r--evaluate.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/evaluate.c b/evaluate.c
index c501323..f976645 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -921,9 +921,16 @@ static struct symbol *evaluate_binop(struct expression *expr)
rtype = integer_promotion(rtype);
} else {
// The rest do usual conversions
- if (op == '&' && expr->left->type == EXPR_PREOP &&
- expr->left->op == '!')
- warning(expr->pos, "dubious: !x & y");
+ const unsigned left_not = expr->left->type == EXPR_PREOP
+ && expr->left->op == '!';
+ const unsigned right_not = expr->right->type == EXPR_PREOP
+ && expr->right->op == '!';
+ if ((op == '&' || op == '|') && (left_not || right_not))
+ warning(expr->pos, "dubious: %sx %c %sy",
+ left_not ? "!" : "",
+ op,
+ right_not ? "!" : "");
+
ltype = usual_conversions(op, expr->left, expr->right,
lclass, rclass, ltype, rtype);
ctype = rtype = ltype;