From 13df06421c6dda58b1095311a4814c583967274e Mon Sep 17 00:00:00 2001 From: Janis Date: Wed, 25 Dec 2024 20:37:35 +0100 Subject: [PATCH] intern struct type the first time it is defined at that point the fields might not yet have proper types --- src/ast2/mod.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ast2/mod.rs b/src/ast2/mod.rs index 45bd398..0801abf 100644 --- a/src/ast2/mod.rs +++ b/src/ast2/mod.rs @@ -977,6 +977,17 @@ impl Ast { loc: SourceLocation, ) -> Index { let i = self.reserve_node(); + self.set_struct_decl(i, name, flags, fields, loc) + } + + fn set_struct_decl>( + &mut self, + i: Index, + name: intern::Index, + flags: StructFlags, + fields: I, + loc: SourceLocation, + ) -> Index { let (offset, _) = self.extend_extra([flags.pack()]); let (names, types) = fields .into_iter() @@ -3885,12 +3896,22 @@ pub mod ast_gen { loc: tokens.current_source_location(), })?; + let decl = self.ast.reserve_node(); let decl = self.parse_braced(tokens, |this, tokens| { this.parse_struct_fields(tokens).map(|fields| { _ = tokens.eat_token(Token::Comma); let flags = StructFlags::new(packed, c_like, fields.len() as u32); - this.ast.push_struct_decl(name, flags, fields, loc) + + this.intern.insert_or_replace_struct_type( + name, + decl, + flags.packed, + flags.c_like, + vec![], + ); + + this.ast.set_struct_decl(decl, name, flags, fields, loc) }) })?;