unsigned res = prec[kind];
assert(res != PREC_BOTTOM);
- return res;
+ /* we need the lowest bit for right-to-left precedence */
+ return 2 * res;
}
/**
} else {
first = 0;
}
- print_expression_prec(argument->expression, PREC_ASSIGNMENT);
+ print_expression_prec(argument->expression, 2 * PREC_ASSIGNMENT);
argument = argument->next;
}
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:
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);
}
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);
}
*/
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);
}
/**
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);
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);
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);
}
*/
void print_expression(const expression_t *expression)
{
- print_expression_prec(expression, PREC_BOTTOM);
+ print_expression_prec(expression, 2 * PREC_BOTTOM);
}
/**