diff options
author | Leo Tenenbaum <pommicket@gmail.com> | 2020-04-21 17:26:47 -0400 |
---|---|---|
committer | Leo Tenenbaum <pommicket@gmail.com> | 2020-04-21 17:26:47 -0400 |
commit | 17709633dca5cb3d2b0b34a353bdf68c112c10e4 (patch) | |
tree | 89ed142165db5911bc3ab667f4cc11bb593fc3b5 /copy.c | |
parent | 606b4078dc2871262455272a56a4ab4d5e90b523 (diff) |
fixed for loop problem (turns out it had to do with implicit type conversions)
Diffstat (limited to 'copy.c')
-rw-r--r-- | copy.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -235,6 +235,7 @@ static inline void copier_ident_translate(Copier *c, Identifier *i) { *i = ident_translate_forced(*i, &c->block->idents); } +/* in must be untyped! */ static void copy_expr(Copier *c, Expression *out, Expression *in) { Allocator *a = c->allocr; *out = *in; @@ -275,7 +276,22 @@ static void copy_expr(Copier *c, Expression *out, Expression *in) { copy_block(c, &wout->body, &win->body, 0); } break; case EXPR_FOR: { - /* TODO */ + ForExpr *fin = in->for_; + ForExpr *fout = out->for_ = allocr_malloc(a, sizeof *fout); + *fout = *fin; + Block *prev = c->block; + c->block = &fout->body; + idents_create(&fout->body.idents, c->allocr, &fout->body); + copy_decl(c, &fout->header, &fin->header); + if (fin->flags & FOR_IS_RANGE) { + fout->range.from = copy_expr_(c, fin->range.from); + if (fin->range.to) fout->range.to = copy_expr_(c, fin->range.to); + if (fin->range.step) fout->range.step = copy_expr_(c, fin->range.step); + } else { + fout->of = copy_expr_(c, fin->of); + } + c->block = prev; + copy_block(c, &fout->body, &fin->body, COPY_BLOCK_DONT_CREATE_IDENTS); } break; case EXPR_FN: copy_fn_expr(c, out->fn = allocr_malloc(a, sizeof *out->fn), in->fn, 0); |