small bugfix with struct literal named values
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 19 Aug 2020 18:49:30 +0000 (13:49 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 19 Aug 2020 18:49:30 +0000 (13:49 -0500)
include/bh.h
onyx
progs/stack_based.onyx
src/onyxchecker.c
src/onyxparser.c
src/onyxsymres.c

index 6ae5e58b0855c286a0313a4492a29cb6bd020bb5..4a57248a642ddd122666ae4131cf8f17dd90c5d6 100644 (file)
@@ -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 9af74f0d190be2d06bf4524e5cb926acb4f9f9dc..ba5c54d50cb564f7322979da83fa5f7d5d6fa0c1 100755 (executable)
Binary files a/onyx and b/onyx differ
index 809e0af5d41143f1e1a57d8bfdba9b870caa1490..865e583e27e84ec4c15902f30a495d159e52ddb7 100644 (file)
@@ -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 {
index 5f51a243f70855ecdde3a279dcea16244eec30e6..a2ca405f04f5a43afe774657c91398cffa867714 100644 (file)
@@ -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;
index c5da87a2810753bd94e88db7270b7fb05fd2b89c..e61e4b52f862ef08d7361ef923c99abc68bf66a4 100644 (file)
@@ -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;
index 573f89c2a51a4c7286924c0d96f2433b150ab677..d0de2ea847b6d0cfe5e37dde2bcf9d256c8858c4 100644 (file)
@@ -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) {