[qfcc] Clean up expr parenthesis setting

Thare are still many const casts, but this does get rid of one set. I
had tried to replace the paren flag with a () unary expression, but that
brought out a whole pile of places that had problems (especially
anything to do with boolean expressions).
This commit is contained in:
Bill Currie 2024-09-14 08:31:26 +09:00
parent 4c603c3989
commit e933eb8fae
4 changed files with 20 additions and 20 deletions

View file

@ -545,6 +545,8 @@ expr_t *new_binary_expr (int op, const expr_t *e1, const expr_t *e2);
*/ */
expr_t *new_unary_expr (int op, const expr_t *e1); expr_t *new_unary_expr (int op, const expr_t *e1);
const expr_t *paren_expr (const expr_t *e);
/** Create a new horizontal vector operantion node. /** Create a new horizontal vector operantion node.
If \a vec is an error expression, then it will be returned instead of a If \a vec is an error expression, then it will be returned instead of a

View file

@ -607,6 +607,15 @@ new_unary_expr (int op, const expr_t *e1)
return e; return e;
} }
const expr_t *
paren_expr (const expr_t *e)
{
auto paren = new_expr ();
*paren = *e;
paren->paren = 1;
return paren;
}
expr_t * expr_t *
new_horizontal_expr (int op, const expr_t *vec, type_t *type) new_horizontal_expr (int op, const expr_t *vec, type_t *type)
{ {
@ -1929,13 +1938,8 @@ asx_expr (int op, const expr_t *e1, const expr_t *e2)
else if (e2->type == ex_error) else if (e2->type == ex_error)
return e2; return e2;
else { else {
expr_t *e = new_expr (); e2 = paren_expr (e2);
auto paren = new_expr (); return assign_expr (e1, binary_expr (op, e1, e2));
*e = *e1;
*paren = *e2;
paren->paren = 1;
return assign_expr (e, binary_expr (op, e1, paren));
} }
} }

View file

@ -75,7 +75,7 @@ check_assign_logic_precedence (const expr_t *dst, const expr_t *src)
// change {a = (b logic c)} to {(a = b) logic c} // change {a = (b logic c)} to {(a = b) logic c}
auto assignment = assign_expr (dst, src->expr.e1); auto assignment = assign_expr (dst, src->expr.e1);
// protect assignment from binary_expr // protect assignment from binary_expr
((expr_t *) assignment)->paren = 1; assignment = paren_expr (assignment);
return binary_expr (src->expr.op, assignment, src->expr.e2); return binary_expr (src->expr.op, assignment, src->expr.e2);
} }
return 0; return 0;

View file

@ -1177,12 +1177,6 @@ reimplement_binary_expr (int op, const expr_t *e1, const expr_t *e2)
return 0; return 0;
} }
static void
set_paren (const expr_t *e)
{
((expr_t *) e)->paren = 1;
}
static const expr_t * static const expr_t *
check_precedence (int op, const expr_t *e1, const expr_t *e2) check_precedence (int op, const expr_t *e1, const expr_t *e2)
{ {
@ -1191,8 +1185,8 @@ check_precedence (int op, const expr_t *e1, const expr_t *e2)
if (op != QC_AND && op != QC_OR && op != '=') { if (op != QC_AND && op != QC_OR && op != '=') {
notice (e1, "precedence of `!' and `%s' inverted for " notice (e1, "precedence of `!' and `%s' inverted for "
"traditional code", get_op_string (op)); "traditional code", get_op_string (op));
set_paren (e1->expr.e1); e1 = paren_expr (e1->expr.e1);
return unary_expr ('!', binary_expr (op, e1->expr.e1, e2)); return unary_expr ('!', binary_expr (op, e1, e2));
} }
} else if (op == '&' || op == '|') { } else if (op == '&' || op == '|') {
if (options.warnings.precedence) if (options.warnings.precedence)
@ -1211,7 +1205,7 @@ check_precedence (int op, const expr_t *e1, const expr_t *e2)
"traditional code", get_op_string (op), "traditional code", get_op_string (op),
get_op_string (e2->expr.op)); get_op_string (e2->expr.op));
e1 = binary_expr (op, e1, e2->expr.e1); e1 = binary_expr (op, e1, e2->expr.e1);
set_paren (e1); e1 = paren_expr (e1);
return binary_expr (e2->expr.op, e1, e2->expr.e2); return binary_expr (e2->expr.op, e1, e2->expr.e2);
} }
if (((op == QC_EQ || op == QC_NE) && is_compare (e2->expr.op)) if (((op == QC_EQ || op == QC_NE) && is_compare (e2->expr.op))
@ -1221,7 +1215,7 @@ check_precedence (int op, const expr_t *e1, const expr_t *e2)
"traditional code", get_op_string (op), "traditional code", get_op_string (op),
get_op_string (e2->expr.op)); get_op_string (e2->expr.op));
e1 = binary_expr (op, e1, e2->expr.e1); e1 = binary_expr (op, e1, e2->expr.e1);
set_paren (e1); e1 = paren_expr (e1);
return binary_expr (e2->expr.op, e1, e2->expr.e2); return binary_expr (e2->expr.op, e1, e2->expr.e2);
} }
} else if (e1->type == ex_expr && !e1->paren) { } else if (e1->type == ex_expr && !e1->paren) {
@ -1233,8 +1227,8 @@ check_precedence (int op, const expr_t *e1, const expr_t *e2)
"traditional code", get_op_string (op), "traditional code", get_op_string (op),
get_op_string (e1->expr.op)); get_op_string (e1->expr.op));
e2 = binary_expr (op, e1->expr.e2, e2); e2 = binary_expr (op, e1->expr.e2, e2);
set_paren (e1); e1 = paren_expr (e1->expr.e1);
return binary_expr (e1->expr.op, e1->expr.e1, e2); return binary_expr (e1->expr.op, e1, e2);
} }
} }
} else { } else {