aboutsummaryrefslogtreecommitdiff
path: root/bootstrap/cgen.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-05 07:28:56 +0200
committerlemon <lsof@mailbox.org>2022-08-05 07:28:56 +0200
commit9667272414380e2d50113e0a0c6408a02e7c23eb (patch)
tree9537c57f7b13aa43ce63553ca44d8ba42e6ed1c3 /bootstrap/cgen.c
parentfc29f3f2b0c3a7c5ef1c75d910cf0815d2edbba2 (diff)
fn type syntax, bugfixs
Diffstat (limited to 'bootstrap/cgen.c')
-rw-r--r--bootstrap/cgen.c14
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");