From 688a9e05b01cd47b1a583848ade627d3f29b52d1 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 6 Nov 2021 12:17:13 +1100 Subject: [PATCH] oceani: change variable.merged to never be NULL variable.merged is now always the primary variable, so it is initialised to the address of the variable itself. Signed-off-by: NeilBrown --- csrc/oceani.mdc | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 0772bcf..364ee29 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -1002,14 +1002,12 @@ need to be freed. For this we need to be able to find it, so assume that { struct variable *v; - if (primary->merged) - // shouldn't happen - primary = primary->merged; // NOTEST + primary = primary->merged; for (v = primary->previous; v; v=v->previous) if (v == secondary || v == secondary->merged || v->merged == secondary || - (v->merged && v->merged == secondary->merged)) { + v->merged == secondary->merged) { v->scope = OutScope; v->merged = primary; } @@ -1105,6 +1103,7 @@ all pending-scope variables become conditionally scoped. v->previous = b->var; b->var = v; v->name = b; + v->merged = v; v->min_depth = v->depth = c->scope_depth; v->scope = InScope; v->in_scope = c->in_scope; @@ -1310,7 +1309,7 @@ For this we have `scope_finalize()`. struct variable *v; for (v = b->var; v; v = v->previous) { struct type *t = v->type; - if (v->merged && v->merged != v) + if (v->merged != v) continue; if (v->global) continue; @@ -2608,8 +2607,7 @@ link to find the primary instance. type_err(c, "%d:BUG: no variable!!", prog, NULL, 0, NULL); // NOTEST return Tnone; // NOTEST } - if (v->merged) - v = v->merged; + v = v->merged; if (v->constant && (rules & Rnoconstant)) { type_err(c, "error: Cannot assign to a constant: %v", prog, NULL, 0, NULL); @@ -2645,8 +2643,7 @@ link to find the primary instance. struct var *var = cast(var, e); struct variable *v = var->var; - if (v->merged) - v = v->merged; // UNTESTED + v = v->merged; lrv = var_value(c, v); rvtype = v->type; break; @@ -3656,8 +3653,7 @@ it is declared, and error will be raised as the name is created as { struct variable *v = cast(var, b->left)->var; struct value *val; - if (v->merged) - v = v->merged; + v = v->merged; val = var_value(c, v); free_value(v->type, val); if (v->type->prepare_type) -- 2.43.0