diff options
author | SimplyTheOther <simplytheother@gmail.com> | 2021-01-10 14:30:39 +0800 |
---|---|---|
committer | SimplyTheOther <simplytheother@gmail.com> | 2021-01-10 14:30:39 +0800 |
commit | b247c0d5aadf6eb7323641ffbcf7cc67bedd2c52 (patch) | |
tree | 3a4d3a0b0569d28f679ecbc74928125034d50f4f /gcc/rust/resolve | |
parent | ee85db852a5a819e559ab00e7a382a34e925447a (diff) | |
parent | 0f42a240e53e932de0ae4799d54fe0bd15d06047 (diff) | |
download | gcc-b247c0d5aadf6eb7323641ffbcf7cc67bedd2c52.zip gcc-b247c0d5aadf6eb7323641ffbcf7cc67bedd2c52.tar.gz gcc-b247c0d5aadf6eb7323641ffbcf7cc67bedd2c52.tar.bz2 |
Merge branch 'master' of https://github.com/redbrain/gccrs
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.h | 23 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.h | 6 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 3 |
3 files changed, 17 insertions, 15 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index c3b2312..310d296 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -65,6 +65,14 @@ public: ResolveType::go (function.get_return_type ().get (), function.get_node_id ()); + NodeId scope_node_id = function.get_node_id (); + resolver->get_name_scope ().push (scope_node_id); + resolver->get_type_scope ().push (scope_node_id); + resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); + resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + + // we make a new scope so the names of parameters are resolved and shadowed + // correctly for (auto ¶m : function.get_function_params ()) { ResolveType::go (param.get_type ().get (), param.get_node_id ()); @@ -72,18 +80,9 @@ public: param.get_node_id ()); } - // setup parent scoping for names - NodeId scope_node_id = function.get_definition ()->get_node_id (); - resolver->get_name_scope ().push (scope_node_id); - resolver->get_type_scope ().push (scope_node_id); - resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); - resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); - - function.get_definition ()->iterate_stmts ( - [&] (AST::Stmt *s) mutable -> bool { - ResolveStmt::go (s, s->get_node_id ()); - return true; - }); + // resolve the function body + ResolveExpr::go (function.get_definition ().get (), + function.get_node_id ()); resolver->get_name_scope ().pop (); resolver->get_type_scope ().pop (); diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h index 87b3cf3..6d751e6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.h +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h @@ -51,12 +51,12 @@ public: void visit (AST::LetStmt &stmt) { + if (stmt.has_init_expr ()) + ResolveExpr::go (stmt.get_init_expr ().get (), stmt.get_node_id ()); + PatternDeclaration::go (stmt.get_pattern ().get (), stmt.get_node_id ()); if (stmt.has_type ()) ResolveType::go (stmt.get_type ().get (), stmt.get_node_id ()); - - if (stmt.has_init_expr ()) - ResolveExpr::go (stmt.get_init_expr ().get (), stmt.get_node_id ()); } private: diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index fe8d7e0..e5b0942 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -285,6 +285,9 @@ ResolveExpr::visit (AST::BlockExpr &expr) return true; }); + if (expr.has_tail_expr ()) + ResolveExpr::go (expr.get_tail_expr ().get (), expr.get_node_id ()); + resolver->get_name_scope ().pop (); resolver->get_type_scope ().pop (); } |