diff --git a/base_data_structures.cpp b/base_data_structures.cpp index 597b7c0..e9c3430 100644 --- a/base_data_structures.cpp +++ b/base_data_structures.cpp @@ -117,7 +117,7 @@ struct Array { return result; } - void ordered_remove(T &item) { + void ordered_remove(T &item) { // Dont use in loops !!!! assert(len > 0); assert(&item >= begin() && &item < end()); int index = get_index(&item); diff --git a/core_polymorph.cpp b/core_polymorph.cpp index 3d6ea7c..b677c53 100644 --- a/core_polymorph.cpp +++ b/core_polymorph.cpp @@ -354,9 +354,11 @@ Ast_Decl *get_or_instantiate_polymorph_lambda(Token *pos, Ast_Decl *poly, Array< if (!result) { result = (Ast_Decl *)ast_copy(poly, poly->parent_scope, &poly->polymorph_parameters, ¶ms); - For(result->lambda->args) { + for (int i = 0; i < result->lambda->args.len; i += 1) { + auto &it = result->lambda->args[i]; if (it->flags & AST_IDENT_POLYMORPH) { - result->lambda->args.ordered_remove(it); //@verify: this does not fuck ordereding + result->lambda->args.ordered_remove(it); + i -= 1; } } diff --git a/core_typechecking.cpp b/core_typechecking.cpp index 774527f..891449e 100644 --- a/core_typechecking.cpp +++ b/core_typechecking.cpp @@ -1696,10 +1696,12 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags, Ast_Type *compound_and_const_str // Find the polymorph if (lambda->flags & AST_POLYMORPH) { Array replacements = {scratch.arena}; - For(matches) { + for (int i = 0; i < matches.len; i += 1) { + Match &it = matches[i]; if (it.lambda_arg->flags & AST_POLYMORPH) { replacements.add(it.call_arg); - matches.ordered_remove(it); //@verify: this does not fuck ordereding + matches.ordered_remove(it); + i -= 1; } } diff --git a/examples/push_struct.core b/examples/push_struct.core index abe979c..46ff98d 100644 --- a/examples/push_struct.core +++ b/examples/push_struct.core @@ -1,14 +1,14 @@ MA :: #import "Arena.core" -PushStruct :: (a: *MA.Arena, $T: Type): *T +PushStruct :: (a: *MA.Arena, $K: Type, $T: Type): *T size := SizeOf(T) result := MA.PushSize(a, size->U64) return result->*T main :: (argc: int, argv: **char): int arena: MA.Arena - a: *int = PushStruct(&arena, int) - b: *F32 = PushStruct(&arena, F32) + a: *int = PushStruct(&arena, int, int) + b: *F32 = PushStruct(&arena, int, F32) padding := SizeOf(int) Assert(arena.len->S64 == (SizeOf(int) + SizeOf(F32) + padding))