diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-01-08 16:49:06 +0000 |
---|---|---|
committer | Philip Herron <herron.philip@googlemail.com> | 2021-01-09 14:47:50 +0000 |
commit | 0f42a240e53e932de0ae4799d54fe0bd15d06047 (patch) | |
tree | efc00c63fd2ec4f1fe1bcb890b82e80240be9c4d | |
parent | 6d7a53b684b5765acda82f39f71bc7798bf0ee94 (diff) | |
download | gcc-0f42a240e53e932de0ae4799d54fe0bd15d06047.zip gcc-0f42a240e53e932de0ae4799d54fe0bd15d06047.tar.gz gcc-0f42a240e53e932de0ae4799d54fe0bd15d06047.tar.bz2 |
Functions with parameters much receive their own scoping Rib
This means that paramters are scoped and shadowed correctly. Currently
the resolver is treating all paramters are shadowing each other if they
have the same name which is incorrect.
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.h | 27 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 3 |
2 files changed, 14 insertions, 16 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index c69e433..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,22 +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; - }); - - if (function.get_definition ()->has_tail_expr ()) - ResolveExpr::go (function.get_definition ()->get_tail_expr ().get (), - function.get_node_id ()); + // 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.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 (); } |