summaryrefslogtreecommitdiff
path: root/copy.c
diff options
context:
space:
mode:
authorLeo Tenenbaum <pommicket@gmail.com>2020-04-21 17:26:47 -0400
committerLeo Tenenbaum <pommicket@gmail.com>2020-04-21 17:26:47 -0400
commit17709633dca5cb3d2b0b34a353bdf68c112c10e4 (patch)
tree89ed142165db5911bc3ab667f4cc11bb593fc3b5 /copy.c
parent606b4078dc2871262455272a56a4ab4d5e90b523 (diff)
fixed for loop problem (turns out it had to do with implicit type conversions)
Diffstat (limited to 'copy.c')
-rw-r--r--copy.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/copy.c b/copy.c
index 7380c05..ec64f54 100644
--- a/copy.c
+++ b/copy.c
@@ -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);