Fix loops

typecheck-v2
Ibrahim Numanagić 2024-01-09 12:36:18 -08:00
parent 10503d3c2a
commit 377e619f7f
2 changed files with 12 additions and 13 deletions

View File

@ -299,6 +299,18 @@ TypecheckVisitor::transformStaticLoopCall(
}
block.push_back(wrap(clone(stmt)));
}
} else if (fn && startswith(fn->value, "std.internal.types.range.staticrange.0:1")) {
if (vars.size() != 1)
error("expected one item");
auto ed =
fn->type->getFunc()->funcGenerics[0].type->getStatic()->evaluate().getInt();
if (ed > MAX_STATIC_ITER)
E(Error::STATIC_RANGE_BOUNDS, fn, MAX_STATIC_ITER, ed);
for (int64_t i = 0; i < ed; i++) {
stmt->rhs = N<IntExpr>(i);
stmt->type = NT<IndexExpr>(N<IdExpr>("Static"), N<IdExpr>("int"));
block.push_back(wrap(clone(stmt)));
}
} else if (fn && startswith(fn->value, "std.internal.types.range.staticrange.0")) {
if (vars.size() != 1)
error("expected one item");
@ -315,18 +327,6 @@ TypecheckVisitor::transformStaticLoopCall(
stmt->type = NT<IndexExpr>(N<IdExpr>("Static"), N<IdExpr>("int"));
block.push_back(wrap(clone(stmt)));
}
} else if (fn && startswith(fn->value, "std.internal.types.range.staticrange.0:1")) {
if (vars.size() != 1)
error("expected one item");
auto ed =
fn->type->getFunc()->funcGenerics[0].type->getStatic()->evaluate().getInt();
if (ed > MAX_STATIC_ITER)
E(Error::STATIC_RANGE_BOUNDS, fn, MAX_STATIC_ITER, ed);
for (int64_t i = 0; i < ed; i++) {
stmt->rhs = N<IntExpr>(i);
stmt->type = NT<IndexExpr>(N<IdExpr>("Static"), N<IdExpr>("int"));
block.push_back(wrap(clone(stmt)));
}
} else if (fn && startswith(fn->value, "std.internal.static.fn_overloads.0")) {
if (vars.size() != 1)
error("expected one item");

View File

@ -95,7 +95,6 @@ class range:
else:
return f"range({self.start}, {self.stop}, {self.step})"
@overload
def staticrange(start: Static[int], stop: Static[int], step: Static[int] = 1):
return range(start, stop, step)