From: Brendan Hansen Date: Wed, 19 Aug 2020 18:49:30 +0000 (-0500) Subject: small bugfix with struct literal named values X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=382bd264b3201d4913f67b23b70bc735b2d201e7;p=onyx.git small bugfix with struct literal named values --- diff --git a/include/bh.h b/include/bh.h index 6ae5e58b..4a57248a 100644 --- a/include/bh.h +++ b/include/bh.h @@ -576,6 +576,8 @@ typedef struct bh__arr { #define bh_arr_each(T, var, arr) for (T* var = (arr); !bh_arr_end((arr), var); var++) #define bh_arr_rev_each(T, var, arr) for (T* var = &bh_arr_last((arr)); !bh_arr_start((arr), var); var--) +#define bh_arr_zero(arr) memset(arr, 0, bh_arr_length(arr) * sizeof(*(arr))); + b32 bh__arr_grow(bh_allocator alloc, void** arr, i32 elemsize, i32 cap); b32 bh__arr_shrink(void** arr, i32 elemsize, i32 cap); b32 bh__arr_free(void **arr); diff --git a/onyx b/onyx index 9af74f0d..ba5c54d5 100755 Binary files a/onyx and b/onyx differ diff --git a/progs/stack_based.onyx b/progs/stack_based.onyx index 809e0af5..865e583e 100644 --- a/progs/stack_based.onyx +++ b/progs/stack_based.onyx @@ -56,6 +56,11 @@ Vec3 :: struct { z: i32 = 0; } +SomeBigThing :: struct { + name: string; + pos: Vec3; +} + mag_squared :: proc (use v: Vec3) -> i32 { return x * x + y * y + z * z; } @@ -163,6 +168,16 @@ start :: proc #export { s3 :: string_concat(heap_allocator, s1, s2); defer string_free(heap_allocator, s3); string_print(s3); + + sbt : SomeBigThing; + sbt.name = s3; + sbt.pos = Vec3.{ 2, 3, 4 }; + string_print(sbt.name); + + v := vmul(vadd(sbt.pos, Vec3.{ 1, 2, 3 }), 3); + print(v.x); + print(v.y); + print(v.z); } vadd :: proc (v1: Vec3, v2: Vec3) -> Vec3 { diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 5f51a243..a2ca405f 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -401,7 +401,7 @@ CHECK(binop_assignment, AstBinaryOp* binop, b32 assignment_is_ok) { } if (!types_are_compatible(binop->left->type, binop->right->type)) { - onyx_message_add(Msg_Type_Binop_Mismatch, + onyx_message_add(Msg_Type_Assignment_Mismatch, binop->token->pos, type_get_name(binop->left->type), type_get_name(binop->right->type)); @@ -651,7 +651,7 @@ CHECK(struct_literal, AstStructLiteral* sl) { if (!types_are_compatible((*formal)->type, (*actual)->type)) { onyx_message_add(Msg_Type_Assignment_Mismatch, - (*actual)->token->pos, + sl->token->pos, type_get_name((*formal)->type), type_get_name((*actual)->type)); return 1; diff --git a/src/onyxparser.c b/src/onyxparser.c index c5da87a2..e61e4b52 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -237,7 +237,7 @@ static b32 parse_possible_struct_literal(OnyxParser* parser, AstTyped** ret) { sm->initial_value = expr; bh_arr_push(sl->named_values, sm); - + } else { bh_arr_push(sl->values, expr); } @@ -522,7 +522,7 @@ static AstTyped* parse_factor(OnyxParser* parser) { if (parser->curr->type != ')') expect_token(parser, ','); } - + consume_token(parser); retval = (AstTyped *) call_node; diff --git a/src/onyxsymres.c b/src/onyxsymres.c index 573f89c2..d0de2ea8 100644 --- a/src/onyxsymres.c +++ b/src/onyxsymres.c @@ -224,6 +224,7 @@ static void symres_struct_literal(AstStructLiteral* sl) { if (bh_arr_length(sl->values) == 0) { bh_arr_set_length(sl->values, sl->type->Struct.mem_count); + bh_arr_zero(sl->values); StructMember s; bh_arr_each(AstStructMember *, smem, sl->named_values) {