code cleanup with `use` on struct variables
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 30 Dec 2020 19:40:56 +0000 (13:40 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 30 Dec 2020 19:40:56 +0000 (13:40 -0600)
onyx
src/onyxsymres.c
tests/struct_robustness.onyx

diff --git a/onyx b/onyx
index 0445ec27d27aa100c3fff70681c0ddc42216771a..b10a3c9594f4d3a79b18b0edf515f0eaffc87387 100755 (executable)
Binary files a/onyx and b/onyx differ
index 95d7e4bf07af56a89a5c32cf7bf391dfaf30b070..8e15a731c01fed73248c2d3aadc864524f99488c 100644 (file)
@@ -567,7 +567,7 @@ static void symres_use(AstUse* use) {
         return;
     }
 
-    if (use->expr->type_node == NULL) goto cannot_use;
+    if (use->expr->type_node == NULL && use->expr->type == NULL) goto cannot_use;
 
     AstType* effective_type = use->expr->type_node;
     if (effective_type->kind == Ast_Kind_Pointer_Type)
@@ -584,16 +584,16 @@ static void symres_use(AstUse* use) {
         if (st->kind == Type_Kind_Pointer)
             st = st->Pointer.elem;
 
-        bh_arr_each(StructMember *, smem, st->Struct.memarr) {
-            AstFieldAccess* fa = make_field_access(use->expr, (*smem)->name);
-            symbol_raw_introduce(semstate.curr_scope, (*smem)->name, use->token->pos, (AstNode *) fa);
-        }
+        bh_table_each_start(StructMember, st->Struct.members);
+            AstFieldAccess* fa = make_field_access(use->expr, value.name);
+            symbol_raw_introduce(semstate.curr_scope, value.name, use->token->pos, (AstNode *) fa);
+        bh_table_each_end;
 
         return;
     }
 
 cannot_use:
-    onyx_report_error(use->token->pos, "Cannot use this.");
+    onyx_report_error(use->token->pos, "Cannot use this because its type is unknown.");
 }
 
 static void symres_directive_solidify(AstDirectiveSolidify** psolid) {
@@ -762,14 +762,8 @@ void symres_function_header(AstFunction* func) {
                 }
 
                 bh_table_each_start(StructMember, st->Struct.members);
-                    AstFieldAccess* fa = onyx_ast_node_new(semstate.node_allocator, sizeof(AstFieldAccess), Ast_Kind_Field_Access);
-                    fa->expr = (AstTyped *) param->local;
-                    fa->field = value.name;
-
-                    symbol_raw_introduce(semstate.curr_scope,
-                            value.name,
-                            param->local->token->pos,
-                            (AstNode *) fa);
+                    AstFieldAccess* fa = make_field_access((AstTyped *) param->local, value.name);
+                    symbol_raw_introduce(semstate.curr_scope, value.name, param->local->token->pos, (AstNode *) fa);
                 bh_table_each_end;
 
             } else {
index 2ba09551aec4278fa3adf04ebd04d6f5384529b1..7e7586f74b09cfe0ddbc18a3612a55668224ae63 100644 (file)
@@ -22,12 +22,13 @@ main :: proc (args: [] cstr) {
             name : str;
         }
 
-        ss := SimpleStruct.{ 41, 67, "Steve" };
+        ss: SimpleStruct = SimpleStruct.{ 41, 67, "Steve" };
 
+        use ss;
         printf("SimpleStruct<%i, %i>(%i, %i, %s)\n",
             sizeof SimpleStruct,
             alignof SimpleStruct,
-            cast(u32) ss.age, ss.height, ss.name);
+            cast(u32) age, height, name);
     }
 
     test_simple_union :: proc () {