diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2019-11-03 19:33:48 -0500 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2019-11-03 19:33:48 -0500 |
commit | db354b0994e4606d8f27e17dc24dbc81f0113c7a (patch) | |
tree | ebc727cf2298ecd13052f000ad0fb49cc0aa5cf1 /typedefs_cgen.c | |
parent | 7a135cb2d258fee49880d3dd9f5f43096bd73331 (diff) |
started to get user-defined types to work with pointers to future types
Diffstat (limited to 'typedefs_cgen.c')
-rw-r--r-- | typedefs_cgen.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/typedefs_cgen.c b/typedefs_cgen.c index 8228a24..f652ca1 100644 --- a/typedefs_cgen.c +++ b/typedefs_cgen.c @@ -72,11 +72,14 @@ static bool typedefs_expr(CGenerator *g, Expression *e) { return false; fn_exit(&e->fn); break; + case EXPR_NEW: + if (e->new.n && !typedefs_expr(g, e->new.n)) + return false; + break; case EXPR_TYPE: case EXPR_C: case EXPR_DSIZEOF: case EXPR_DALIGNOF: - case EXPR_NEW: case EXPR_IDENT: case EXPR_LITERAL_BOOL: case EXPR_LITERAL_INT: @@ -90,17 +93,41 @@ static bool typedefs_expr(CGenerator *g, Expression *e) { } static bool typedefs_decl(CGenerator *g, Declaration *d) { + d->c.ids = NULL; for (int idx = 0; idx < (int)arr_len(d->idents); idx++) { Identifier i = d->idents[idx]; Type *type = decl_type_at_index(d, idx); Value *val = decl_val_at_index(d, idx); if (type->kind == TYPE_TYPE) { + if (d->c.ids == NULL) + d->c.ids = calloc(arr_len(d->idents), sizeof *d->c.ids); /* generate typedef */ + IdentID id; + if (g->block != NULL) id = d->c.ids[idx] = g->ident_counter++; cgen_write(g, "typedef "); - if (!cgen_type_pre(g, val->type, d->where)) return false; + if (val->type->kind == TYPE_STRUCT) { + cgen_write(g, "struct "); + if (g->block == NULL) { + /* we can refer to this by its name */ + cgen_ident(g, i); + } else { + /* we need to use an ID ): */ + cgen_ident_id(g, id); + } + } else { + if (!cgen_type_pre(g, val->type, d->where)) return false; + } cgen_write(g, " "); - cgen_ident(g, i); - if (!cgen_type_post(g, val->type, d->where)) return false; + if (g->block == NULL) { + /* we can refer to this by its name */ + cgen_ident(g, i); + } else { + /* we need to use an ID ): */ + cgen_ident_id(g, id); + } + if (val->type->kind != TYPE_STRUCT) { + if (!cgen_type_post(g, val->type, d->where)) return false; + } cgen_write(g, ";"); cgen_nl(g); } |