- fixed r23189: the AST-printer doubles the precesion to have one free
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Sat, 25 Oct 2008 22:37:06 +0000 (22:37 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Sat, 25 Oct 2008 22:37:06 +0000 (22:37 +0000)
  bit for right-to-left handling

[r23194]

ast.c

diff --git a/ast.c b/ast.c
index 29a2bb0..6cfe1ec 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -175,7 +175,8 @@ static unsigned get_expression_precedence(expression_kind_t kind)
        unsigned res = prec[kind];
 
        assert(res != PREC_BOTTOM);
-       return res;
+       /* we need the lowest bit for right-to-left precedence */
+       return 2 * res;
 }
 
 /**
@@ -398,7 +399,7 @@ static void print_call_expression(const call_expression_t *call)
                } else {
                        first = 0;
                }
-               print_expression_prec(argument->expression, PREC_ASSIGNMENT);
+               print_expression_prec(argument->expression, 2 * PREC_ASSIGNMENT);
 
                argument = argument->next;
        }
@@ -498,7 +499,7 @@ static void print_unary_expression(const unary_expression_t *unexpr)
                break;
        case EXPR_UNARY_ASSUME:
                fputs("__assume(", out);
-               print_expression_prec(unexpr->value, PREC_ASSIGNMENT);
+               print_expression_prec(unexpr->value, 2 * PREC_ASSIGNMENT);
                fputc(')', out);
                return;
        default:
@@ -591,7 +592,7 @@ static void print_builtin_symbol(const builtin_symbol_expression_t *expression)
 static void print_builtin_constant(const builtin_constant_expression_t *expression)
 {
        fputs("__builtin_constant_p(", out);
-       print_expression_prec(expression->value, PREC_ASSIGNMENT);
+       print_expression_prec(expression->value, 2 * PREC_ASSIGNMENT);
        fputc(')', out);
 }
 
@@ -603,14 +604,14 @@ static void print_builtin_constant(const builtin_constant_expression_t *expressi
 static void print_builtin_prefetch(const builtin_prefetch_expression_t *expression)
 {
        fputs("__builtin_prefetch(", out);
-       print_expression_prec(expression->adr, PREC_ASSIGNMENT);
+       print_expression_prec(expression->adr, 2 * PREC_ASSIGNMENT);
        if (expression->rw) {
                fputc(',', out);
-               print_expression_prec(expression->rw, PREC_ASSIGNMENT);
+               print_expression_prec(expression->rw, 2 * PREC_ASSIGNMENT);
        }
        if (expression->locality) {
                fputc(',', out);
-               print_expression_prec(expression->locality, PREC_ASSIGNMENT);
+               print_expression_prec(expression->locality, 2 * PREC_ASSIGNMENT);
        }
        fputc(')', out);
 }
@@ -622,15 +623,15 @@ static void print_builtin_prefetch(const builtin_prefetch_expression_t *expressi
  */
 static void print_conditional(const conditional_expression_t *expression)
 {
-       print_expression_prec(expression->condition, PREC_LOGICAL_OR);
+       print_expression_prec(expression->condition, 2 * PREC_LOGICAL_OR);
        fputs(" ? ", out);
        if (expression->true_expression != NULL) {
-               print_expression_prec(expression->true_expression, PREC_EXPRESSION);
+               print_expression_prec(expression->true_expression, 2 * PREC_EXPRESSION);
                fputs(" : ", out);
        } else {
                fputs(": ", out);
        }
-       print_expression_prec(expression->false_expression, PREC_CONDITIONAL);
+       print_expression_prec(expression->false_expression, 2 * PREC_CONDITIONAL);
 }
 
 /**
@@ -641,7 +642,7 @@ static void print_conditional(const conditional_expression_t *expression)
 static void print_va_start(const va_start_expression_t *const expression)
 {
        fputs("__builtin_va_start(", out);
-       print_expression_prec(expression->ap, PREC_ASSIGNMENT);
+       print_expression_prec(expression->ap, 2 * PREC_ASSIGNMENT);
        fputs(", ", out);
        fputs(expression->parameter->symbol->string, out);
        fputc(')', out);
@@ -655,7 +656,7 @@ static void print_va_start(const va_start_expression_t *const expression)
 static void print_va_arg(const va_arg_expression_t *expression)
 {
        fputs("__builtin_va_arg(", out);
-       print_expression_prec(expression->ap, PREC_ASSIGNMENT);
+       print_expression_prec(expression->ap, 2 * PREC_ASSIGNMENT);
        fputs(", ", out);
        print_type(expression->base.type);
        fputc(')', out);
@@ -687,7 +688,7 @@ static void print_classify_type_expression(
        const classify_type_expression_t *const expr)
 {
        fputs("__builtin_classify_type(", out);
-       print_expression_prec(expr->type_expression, PREC_ASSIGNMENT);
+       print_expression_prec(expr->type_expression, 2 * PREC_ASSIGNMENT);
        fputc(')', out);
 }
 
@@ -1444,7 +1445,7 @@ static void print_normal_declaration(const declaration_t *declaration)
  */
 void print_expression(const expression_t *expression)
 {
-       print_expression_prec(expression, PREC_BOTTOM);
+       print_expression_prec(expression, 2 * PREC_BOTTOM);
 }
 
 /**