diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-06-23 13:14:49 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-23 13:14:49 +0000 |
commit | 4e5baf7e679a890c22804d16b99fc6794486825b (patch) | |
tree | f08c021b2e536fa1c2677ddbedf9bd432033d47d /gcc/rust/resolve/rust-ast-resolve-stmt.h | |
parent | ce545f5318b3ff494caed8108f746ad045dfeab6 (diff) | |
parent | 012401ab1c98ea6fa578bd27b018037ec55464a2 (diff) | |
download | gcc-4e5baf7e679a890c22804d16b99fc6794486825b.zip gcc-4e5baf7e679a890c22804d16b99fc6794486825b.tar.gz gcc-4e5baf7e679a890c22804d16b99fc6794486825b.tar.bz2 |
Merge #520
520: Add support for struct definitions to be within a block r=philberty a=philberty
We still have bugs handling unit-structs but this allows for Tuple Structs
and normal named field structs to be declared within a block and referenced
lexically. This allows rust statements to follow the correct grammar.
Fixes #519
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve-stmt.h')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.h | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h index 7ff80e4..3fd1cfa 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.h +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h @@ -39,8 +39,6 @@ public: stmt->accept_vis (resolver); }; - ~ResolveStmt () {} - void visit (AST::ExprStmtWithBlock &stmt) override { ResolveExpr::go (stmt.get_expr ().get (), stmt.get_node_id ()); @@ -67,6 +65,70 @@ public: ResolveType::go (stmt.get_type ().get (), stmt.get_node_id ()); } + void visit (AST::TupleStruct &struct_decl) override + { + auto path = CanonicalPath (struct_decl.get_identifier ()); + resolver->get_type_scope ().insert ( + path, struct_decl.get_node_id (), struct_decl.get_locus (), false, + [&] (const CanonicalPath &, NodeId, Location locus) -> void { + RichLocation r (struct_decl.get_locus ()); + r.add_range (locus); + rust_error_at (r, "redefined multiple times"); + }); + + NodeId scope_node_id = struct_decl.get_node_id (); + resolver->get_type_scope ().push (scope_node_id); + + if (struct_decl.has_generics ()) + { + for (auto &generic : struct_decl.get_generic_params ()) + { + ResolveGenericParam::go (generic.get (), + struct_decl.get_node_id ()); + } + } + + struct_decl.iterate ([&] (AST::TupleField &field) mutable -> bool { + ResolveType::go (field.get_field_type ().get (), + struct_decl.get_node_id ()); + return true; + }); + + resolver->get_type_scope ().pop (); + } + + void visit (AST::StructStruct &struct_decl) override + { + auto path = CanonicalPath (struct_decl.get_identifier ()); + resolver->get_type_scope ().insert ( + path, struct_decl.get_node_id (), struct_decl.get_locus (), false, + [&] (const CanonicalPath &, NodeId, Location locus) -> void { + RichLocation r (struct_decl.get_locus ()); + r.add_range (locus); + rust_error_at (r, "redefined multiple times"); + }); + + NodeId scope_node_id = struct_decl.get_node_id (); + resolver->get_type_scope ().push (scope_node_id); + + if (struct_decl.has_generics ()) + { + for (auto &generic : struct_decl.get_generic_params ()) + { + ResolveGenericParam::go (generic.get (), + struct_decl.get_node_id ()); + } + } + + struct_decl.iterate ([&] (AST::StructField &field) mutable -> bool { + ResolveType::go (field.get_field_type ().get (), + struct_decl.get_node_id ()); + return true; + }); + + resolver->get_type_scope ().pop (); + } + private: ResolveStmt (NodeId parent) : ResolverBase (parent) {} }; |