[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);
const expr_t *paren_expr (const expr_t *e);
/** Create a new horizontal vector operantion node.
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;
}
const expr_t *
paren_expr (const expr_t *e)
{
auto paren = new_expr ();
*paren = *e;
paren->paren = 1;
return paren;
}
expr_t *
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)
return e2;
else {
expr_t *e = new_expr ();
auto paren = new_expr ();
*e = *e1;
*paren = *e2;
paren->paren = 1;
return assign_expr (e, binary_expr (op, e1, paren));
e2 = paren_expr (e2);
return assign_expr (e1, binary_expr (op, e1, e2));
}
}

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}
auto assignment = assign_expr (dst, src->expr.e1);
// 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 0;

View file

@ -1177,12 +1177,6 @@ reimplement_binary_expr (int op, const expr_t *e1, const expr_t *e2)
return 0;
}
static void
set_paren (const expr_t *e)
{
((expr_t *) e)->paren = 1;
}
static const expr_t *
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 != '=') {
notice (e1, "precedence of `!' and `%s' inverted for "
"traditional code", get_op_string (op));
set_paren (e1->expr.e1);
return unary_expr ('!', binary_expr (op, e1->expr.e1, e2));
e1 = paren_expr (e1->expr.e1);
return unary_expr ('!', binary_expr (op, e1, e2));
}
} else if (op == '&' || op == '|') {
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),
get_op_string (e2->expr.op));
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);
}
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),
get_op_string (e2->expr.op));
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);
}
} 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),
get_op_string (e1->expr.op));
e2 = binary_expr (op, e1->expr.e2, e2);
set_paren (e1);
return binary_expr (e1->expr.op, e1->expr.e1, e2);
e1 = paren_expr (e1->expr.e1);
return binary_expr (e1->expr.op, e1, e2);
}
}
} else {