mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 05:01:24 +00:00
[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:
parent
4c603c3989
commit
e933eb8fae
4 changed files with 20 additions and 20 deletions
|
@ -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
|
||||||
|
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue