Signed-off-by: Al Viro <[EMAIL PROTECTED]>
---
 evaluate.c |   30 ++++++++++++++++--------------
 1 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/evaluate.c b/evaluate.c
index 2203e67..e299299 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -1118,12 +1118,14 @@ static int compatible_float_op(int op)
                op == SPECIAL_DIV_ASSIGN;
 }
 
-static int evaluate_assign_op(struct expression *expr, struct symbol *target,
-       struct expression **rp, struct symbol *source, int op)
+static int evaluate_assign_op(struct expression *expr)
 {
+       struct symbol *target = expr->left->ctype;
+       struct symbol *source = expr->right->ctype;
        struct symbol *t, *s;
        int tclass = classify_type(target, &t);
        int sclass = classify_type(source, &s);
+       int op = expr->op;
 
        if (tclass & sclass & TYPE_NUM) {
                if (tclass & TYPE_FLOAT && !compatible_float_op(op)) {
@@ -1131,14 +1133,14 @@ static int evaluate_assign_op(struct expression *expr, 
struct symbol *target,
                        return 0;
                }
                if (tclass & TYPE_RESTRICT) {
-                       if (!restricted_binop(op, target)) {
+                       if (!restricted_binop(op, t)) {
                                expression_error(expr, "bad restricted 
assignment");
                                return 0;
                        }
                        /* allowed assignments unfoul */
                        if (sclass & TYPE_FOULED && s->ctype.base_type == t)
                                goto Cast;
-                       if (!restricted_value(*rp, target))
+                       if (!restricted_value(expr->right, t))
                                return 1;
                } else if (!(sclass & TYPE_RESTRICT))
                        goto Cast;
@@ -1146,22 +1148,23 @@ static int evaluate_assign_op(struct expression *expr, 
struct symbol *target,
                if (t == s)
                        return 1;
                warning(expr->pos, "invalid restricted assignment");
-               *rp = cast_to(*rp, target);
+               expr->right = cast_to(expr->right, target);
                return 0;
-       } else if (tclass & TYPE_PTR) {
+       }
+       if (tclass & TYPE_PTR) {
                if (op == SPECIAL_ADD_ASSIGN || op == SPECIAL_SUB_ASSIGN) {
-                       evaluate_ptr_add(expr, target, rp);
+                       evaluate_ptr_add(expr, target, &expr->right);
                        return 1;
                }
                expression_error(expr, "invalid pointer assignment");
                return 0;
-       } else {
-               expression_error(expr, "invalid assignment");
-               return 0;
        }
 
+       expression_error(expr, "invalid assignment");
+       return 0;
+
 Cast:
-       *rp = cast_to(*rp, target);
+       expr->right = cast_to(expr->right, target);
        return 1;
 }
 
@@ -1274,12 +1277,11 @@ static struct symbol *evaluate_assignment(struct 
expression *expr)
 
        ltype = left->ctype;
 
-       rtype = degenerate(right);
-
        if (expr->op != '=') {
-               if (!evaluate_assign_op(where, ltype, &where->right, rtype, 
expr->op))
+               if (!evaluate_assign_op(expr))
                        return NULL;
        } else {
+               rtype = degenerate(right);
                if (!compatible_assignment_types(where, ltype, &where->right, 
rtype, "assignment"))
                        return NULL;
        }
-- 
1.5.0-rc2.GIT


-
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to