[qfcc] Prevent dags in type expressions

While they might be ok, I expect them to cause some issues when doing
compile-time evaluations of type expressions, so use of dags seems to be
a premature optimization. However, as the "no dags" flag is propagated
to parent expression nodes, it may prove useful in other contexts.
This commit is contained in:
Bill Currie 2024-04-30 10:58:51 +09:00
parent 966275c294
commit 60730a5b12
3 changed files with 7 additions and 4 deletions

View file

@ -323,6 +323,8 @@ typedef struct expr_s {
unsigned paren:1; ///< the expression is enclosed in ()
unsigned rvalue:1; ///< the expression is on the right side of =
unsigned implicit:1; ///< don't warn for implicit casts
unsigned nodag:1; ///< prevent use of dags for this expression
///< propagates up
union {
ex_label_t label; ///< label expression
ex_labelref_t labelref; ///< label reference expression (&)

View file

@ -538,8 +538,6 @@ new_block_expr (const expr_t *old)
expr_t *
new_binary_expr (int op, const expr_t *e1, const expr_t *e2)
{
expr_t *e = new_expr ();
if (e1->type == ex_error) {
internal_error (e1, "error expr in new_binary_expr");
}
@ -547,7 +545,9 @@ new_binary_expr (int op, const expr_t *e1, const expr_t *e2)
internal_error (e2, "error expr in new_binary_expr");
}
expr_t *e = new_expr ();
e->type = ex_expr;
e->nodag = e1->nodag | e2->nodag;
e->expr.op = op;
e->expr.e1 = e1;
e->expr.e2 = e2;
@ -574,13 +574,14 @@ build_block_expr (expr_t *list, bool set_result)
expr_t *
new_unary_expr (int op, const expr_t *e1)
{
expr_t *e = new_expr ();
if (e1 && e1->type == ex_error) {
internal_error (e1, "error expr in new_binary_expr");
}
expr_t *e = new_expr ();
e->type = ex_uexpr;
e->nodag = e1->nodag;
e->expr.op = op;
e->expr.e1 = e1;
return e;

View file

@ -53,7 +53,7 @@ edag_flush (void)
const expr_t *
edag_add_expr (const expr_t *expr)
{
if (!expr) {
if (!expr || expr->nodag) {
return expr;
}
for (size_t i = 0; i < expr_dag.size; i++) {