bugfixes with operator overloading
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 23 Oct 2021 01:33:13 +0000 (20:33 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 23 Oct 2021 01:33:13 +0000 (20:33 -0500)
src/checker.c
src/types.c

index 99621de5caa28aea4ac3007c9f8bd174d40e1cbd..39ffebe3b53a0eb555f7d0382cf7ab95d165ca7f 100644 (file)
@@ -86,6 +86,7 @@ CheckStatus check_do_block(AstDoBlock** pdoblock);
 
 // HACK HACK HACK
 b32 expression_types_must_be_known = 0;
+b32 all_checks_are_final           = 1;
 
 #define STATEMENT_LEVEL 1
 #define EXPRESSION_LEVEL 2
@@ -601,9 +602,12 @@ static AstCall* binaryop_try_operator_overload(AstBinaryOp* binop, AstTyped* thi
     args.values[1] = (AstTyped *) make_argument(context.ast_alloc, binop->right);
     if (third_argument != NULL) args.values[2] = (AstTyped *) make_argument(context.ast_alloc, third_argument);
 
+    u32 current_all_checks_are_final = all_checks_are_final;
+    all_checks_are_final = 0;
     u32 current_checking_level_store = current_checking_level;
     bh_arr_each(AstTyped *, v, args.values) check_argument((AstArgument **) v);
     current_checking_level = current_checking_level_store;
+    all_checks_are_final   = current_all_checks_are_final;
 
     if (binop_is_assignment(binop->operation)) {
         args.values[0] = (AstTyped *) make_address_of(context.ast_alloc, binop->left);
@@ -983,12 +987,15 @@ CheckStatus check_binaryop(AstBinaryOp** pbinop) {
          binop->type = &basic_types[Basic_Kind_Bool];
     }
 
-    binop->flags |= Ast_Flag_Has_Been_Checked;
+    if (all_checks_are_final) {
+        binop->flags |= Ast_Flag_Has_Been_Checked;
 
-    if (binop->flags & Ast_Flag_Comptime) {
-        // NOTE: Not a binary op
-        *pbinop = (AstBinaryOp *) ast_reduce(context.ast_alloc, (AstTyped *) binop);
+        if (binop->flags & Ast_Flag_Comptime) {
+            // NOTE: Not a binary op
+            *pbinop = (AstBinaryOp *) ast_reduce(context.ast_alloc, (AstTyped *) binop);
+        }
     }
+
     return Check_Success;
 
 bad_binaryop:
index babbe89ecd364c3a096c95b2930285024ac2f9f8..f3fbae9deb1101fdd757ac3560e90af2500730de 100644 (file)
@@ -334,6 +334,7 @@ Type* type_build_from_ast(bh_allocator alloc, AstType* type_node) {
                 s_type->Struct.name = s_node->name;
                 s_type->Struct.mem_count = bh_arr_length(s_node->members);
                 s_type->Struct.meta_tags = s_node->meta_tags;
+                s_type->Struct.constructed_from = NULL;
                 type_register(s_type);
 
                 s_type->Struct.memarr = NULL;