Type* iter_type = fornode->iter->type;
if (iter_type == NULL) YIELD(fornode->token->pos, "Waiting for iteration expression type to be known.");
+ OnyxFilePos error_loc = fornode->var->token->pos;
+ if (error_loc.filename == NULL) {
+ error_loc = fornode->token->pos;
+ }
+
fornode->loop_type = For_Loop_Invalid;
if (types_are_compatible(iter_type, &basic_types[Basic_Kind_I32])) {
if (fornode->by_pointer) {
- ERROR(fornode->var->token->pos, "Cannot iterate by pointer over a range.");
+ ERROR(error_loc, "Cannot iterate by pointer over a range.");
}
AstNumLit* low_0 = make_int_literal(context.ast_alloc, 0);
}
else if (types_are_compatible(iter_type, builtin_range_type_type)) {
if (fornode->by_pointer) {
- ERROR(fornode->var->token->pos, "Cannot iterate by pointer over a range.");
+ ERROR(error_loc, "Cannot iterate by pointer over a range.");
}
// NOTE: Blindly copy the first range member's type which will
}
else if (iter_type->kind == Type_Kind_VarArgs) {
if (fornode->by_pointer) {
- ERROR_(fornode->var->token->pos, "Cannot iterate by pointer over '%s'.", type_get_name(iter_type));
+ ERROR_(error_loc, "Cannot iterate by pointer over '%s'.", type_get_name(iter_type));
}
fornode->var->type = iter_type->VarArgs.elem;
}
else if (type_struct_constructed_from_poly_struct(iter_type, builtin_iterator_type)) {
if (fornode->by_pointer) {
- ERROR(fornode->var->token->pos, "Cannot iterate by pointer over an iterator.");
+ ERROR(error_loc, "Cannot iterate by pointer over an iterator.");
}
// HACK: This assumes the Iterator type only has a single type argument.
fornode->var->flags |= Ast_Flag_Cannot_Take_Addr;
if (fornode->loop_type == For_Loop_Invalid) {
- ERROR_(fornode->iter->token->pos,
+ ERROR_(error_loc,
"Cannot iterate over a '%s'.",
type_get_name(iter_type));
}
// This could be a cool feature where you can write:
//
-// foo(x, y) {
+// foo(x, y) #{
// // ...
// }
//
for_node->by_pointer = 1;
}
- OnyxToken* local_sym = expect_token(parser, Token_Type_Symbol);
- AstLocal* var_node = make_local(parser->allocator, local_sym, NULL);
+ if (next_tokens_are(parser, 2, Token_Type_Symbol, ':')) {
+ OnyxToken* local_sym = expect_token(parser, Token_Type_Symbol);
+ AstLocal* var_node = make_local(parser->allocator, local_sym, NULL);
- for_node->var = var_node;
+ for_node->var = var_node;
+
+ expect_token(parser, ':');
+ } else {
+ // HACK
+ static char it_name[] = "it ";
+ static OnyxToken it_token = { Token_Type_Symbol, 2, it_name, { 0 } };
+
+ AstLocal* var_node = make_local(parser->allocator, &it_token, NULL);
+ for_node->var = var_node;
+ }
- expect_token(parser, ':');
for_node->iter = parse_expression(parser, 1);
for_node->stmt = parse_block(parser, 1, NULL);