From 68bdd0987d4fc7c888f8f416d14a6ec70e49a7a8 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 17 Dec 2021 16:01:11 +1100 Subject: [PATCH] oceani: add type entry for new structs early. When a 'struct foo' declaration is found, add the type when 'foo' is seen rather than when the whole declaration is seen. This keeps the order of types stable Signed-off-by: NeilBrown --- csrc/oceani-tests.mdc | 2 +- csrc/oceani.mdc | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 8256950..3be36db 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -1011,8 +1011,8 @@ various places that `type_err()` are called. ###### output: type_err5 .tmp.code:8:7: error: type already declared: foo .tmp.code:2:7: info: this is location of declartion: foo - .tmp.code:2:7: error: type has recursive definition: foo .tmp.code:5:7: error: type has recursive definition: baz + .tmp.code:2:7: error: type has recursive definition: foo ###### test: type_err6 diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 0605d97..e032a7d 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -2917,24 +2917,31 @@ function will be needed. } ###### top level grammar - DeclareStruct -> struct IDENTIFIER FieldBlock Newlines ${ { - struct type *t; - t = find_type(c, $ID.txt); - if (!t) - t = add_type(c, $ID.txt, &structure_prototype); - else if (t->size >= 0) { + $*type + StructName -> IDENTIFIER ${ { + struct type *t = find_type(c, $ID.txt); + + if (t && t->size >= 0) { tok_err(c, "error: type already declared", &$ID); tok_err(c, "info: this is location of declartion", &t->first_use); - /* Create a new one - duplicate */ - t = add_type(c, $ID.txt, &structure_prototype); - } else { - struct type tmp = *t; - *t = structure_prototype; - t->name = tmp.name; - t->next = tmp.next; + t = NULL; } - t->structure.field_list = $first_use = $ID; + $0 = t; + } }$ + $void + DeclareStruct -> struct StructName FieldBlock Newlines ${ { + struct type *t = $name = tmp.name; + t->next = tmp.next; + t->first_use = tmp.first_use; + + t->structure.field_list = $first_use = $ID; + t = add_type(c, $ID.txt, NULL); // UNTESTED + t->first_use = $ID; // UNTESTED } $0 = find_anon_type(c, &reference_prototype, "@%.*s", $ID.txt.len, $ID.txt.txt); -- 2.43.0