mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-11 20:03:11 +00:00
[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:
parent
966275c294
commit
60730a5b12
3 changed files with 7 additions and 4 deletions
|
@ -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 (&)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in a new issue