diff options
Diffstat (limited to 'bootstrap/cgen.c')
| -rw-r--r-- | bootstrap/cgen.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/bootstrap/cgen.c b/bootstrap/cgen.c index faf7b6f..2f92375 100644 --- a/bootstrap/cgen.c +++ b/bootstrap/cgen.c @@ -180,6 +180,8 @@ genexpr(struct expr *ex) { case Ename: if ((ex->ref->t == Dfn || ex->ref->t == Dstatic) && *ex->ref->_cname) pri("%s", *ex->ref->_cname); + else if (ex->ref->t == Dlet && ex->ref->var.id >= 0) + pri("%s_%d", ex->ref->name, ex->ref->var.id); else pri("%s", ex->ref->name); break; @@ -255,7 +257,7 @@ genstmt(struct stmt *stmt) { ; struct decl decl = stmt->decl; switch (decl.t) { case Dlet: - pri("%t %s", decl.var.ty, decl.name); + pri("%t %s_%d", decl.var.ty, decl.name, decl.var.id); if (decl.var.ini) { pri(" = "); if ((decl.var.ty->t == TYstruct || decl.var.ty->t == TYarr) @@ -521,9 +523,14 @@ defctype(const struct type *ty, void *_) { switch (ty->t) { case TYvoid: case TYbool: case TYint: case TYfloat: - case TYptr: case TYenum: + break; + case TYenum: + defctype(ty->enu.intty, NULL); return; - case TYarr: + case TYptr: + defctype(ty->child, NULL); + break; + case TYarr: assert(ty->length >= 0); defctype(ty->child, NULL); *cname = xasprintf("__ty%d", id++); @@ -562,6 +569,7 @@ defctype(const struct type *ty, void *_) { pri("%s %s {\n", kind, *cname); for (int i = 0; i < ty->agg.flds.n; ++i) { struct aggfield fld = ty->agg.flds.d[i]; + defctype(ty->agg.flds.d[i].ty, NULL); pri("%t %s;\n", fld.ty, fld.name); } pri("};\n"); |