aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-06-25 12:01:47 +0200
committerBad Diode <bd@badd10de.dev>2024-06-25 12:01:47 +0200
commit1980bc35c8d161089d3f996abcce80bc67056736 (patch)
tree07686fbe2d00aafe34b66ed4dcb858e7dc129548 /src/main.c
parentf39149eaac8a7e6400aca1edea4bf47e3941a3fc (diff)
downloadbdl-1980bc35c8d161089d3f996abcce80bc67056736.tar.gz
bdl-1980bc35c8d161089d3f996abcce80bc67056736.zip
Add compound types for anonymous struct fields
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/src/main.c b/src/main.c
index 6c3f3a5..f792b10 100644
--- a/src/main.c
+++ b/src/main.c
@@ -534,33 +534,35 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) {
534 // TODO: make sure it didn't exist before. 534 // TODO: make sure it didn't exist before.
535 StructMap *e = structmap_insert( 535 StructMap *e = structmap_insert(
536 &scope->structs, symbol, (Struct){.name = symbol}, a->storage); 536 &scope->structs, symbol, (Struct){.name = symbol}, a->storage);
537 for (sz i = 0; i < array_size(node->struct_field); i++) { 537 // for (sz i = 0; i < array_size(node->struct_field); i++) {
538 Node *field = node->struct_field[i]; 538 // Node *field = node->struct_field[i];
539 Str field_name = field->field_name->value.str; 539 // // TODO: handle compound types
540 Str field_type = field->field_type->value.str; 540 // Str field_name = field->value.str;
541 if (fieldmap_lookup(&e->val.fields, field_name)) { 541 // Str field_type = field->field_type->value.str;
542 eprintln( 542 // if (fieldmap_lookup(&e->val.fields, field_name)) {
543 "%s:%d:%d: error: struct field '%s.%s' already exists", 543 // eprintln(
544 a->file_name, field->line, field->col, symbol, 544 // "%s:%d:%d: error: struct field '%s.%s' already exists",
545 field_name); 545 // a->file_name, field->line, field->col, symbol,
546 } 546 // field_name);
547 if (field->field_val) { 547 // }
548 Type type = type_inference(a, field->field_val, scope); 548 // if (field->field_val) {
549 if (!str_eq(type, field_type)) { 549 // Type type = type_inference(a, field->field_val, scope);
550 eprintln( 550 // if (!str_eq(type, field_type)) {
551 "%s:%d:%d: error: mismatched types in struct value " 551 // eprintln(
552 "for '%s.%s' ", 552 // "%s:%d:%d: error: mismatched types in struct "
553 a->file_name, field->line, field->col, symbol, 553 // "value "
554 field_name); 554 // "for '%s.%s': %s expected %s",
555 } 555 // a->file_name, field->line, field->col, symbol,
556 } 556 // field_name, type, field_type);
557 fieldmap_insert(&e->val.fields, field_name, 557 // }
558 (Field){.name = field_name, 558 // }
559 .type = field_type, 559 // fieldmap_insert(&e->val.fields, field_name,
560 .val = field->field_val}, 560 // (Field){.name = field_name,
561 a->storage); 561 // .type = field_type,
562 field->type = field_type; 562 // .val = field->field_val},
563 } 563 // a->storage);
564 // field->type = field_type;
565 // }
564 typemap_insert(&scope->types, symbol, symbol, a->storage); 566 typemap_insert(&scope->types, symbol, symbol, a->storage);
565 return node->type; 567 return node->type;
566 } break; 568 } break;
@@ -572,7 +574,7 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) {
572 (Enum){.name = symbol}, a->storage); 574 (Enum){.name = symbol}, a->storage);
573 for (sz i = 0; i < array_size(node->struct_field); i++) { 575 for (sz i = 0; i < array_size(node->struct_field); i++) {
574 Node *field = node->struct_field[i]; 576 Node *field = node->struct_field[i];
575 Str field_name = field->field_name->value.str; 577 Str field_name = field->value.str;
576 if (fieldmap_lookup(&e->val.fields, field_name)) { 578 if (fieldmap_lookup(&e->val.fields, field_name)) {
577 eprintln( 579 eprintln(
578 "%s:%d:%d: error: enum field '%s.%s' already exists", 580 "%s:%d:%d: error: enum field '%s.%s' already exists",
@@ -865,7 +867,7 @@ type_inference(Analyzer *a, Node *node, TypeScope *scope) {
865 } 867 }
866 for (sz i = 0; i < array_size(node->elements); i++) { 868 for (sz i = 0; i < array_size(node->elements); i++) {
867 Node *next = node->elements[i]; 869 Node *next = node->elements[i];
868 Str field_name = next->field_name->value.str; 870 Str field_name = next->value.str;
869 FieldMap *field = fieldmap_lookup(&s->val.fields, field_name); 871 FieldMap *field = fieldmap_lookup(&s->val.fields, field_name);
870 if (!field) { 872 if (!field) {
871 eprintln( 873 eprintln(
@@ -1154,7 +1156,7 @@ analyzer_symbols(Analyzer *a, Node *node, Scope *scope) {
1154 // TODO: symcheck the value expression? 1156 // TODO: symcheck the value expression?
1155 for (sz i = 0; i < array_size(node->struct_field); i++) { 1157 for (sz i = 0; i < array_size(node->struct_field); i++) {
1156 Node *field = node->struct_field[i]; 1158 Node *field = node->struct_field[i];
1157 Str field_name = field->field_name->value.str; 1159 Str field_name = field->value.str;
1158 if (symmap_lookup(&map->val.fields, field_name) != NULL) { 1160 if (symmap_lookup(&map->val.fields, field_name) != NULL) {
1159 eprintln( 1161 eprintln(
1160 "%s:%d:%d: error: enum field '%s.%s' already exists", 1162 "%s:%d:%d: error: enum field '%s.%s' already exists",