aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-01-08 16:49:06 +0000
committerPhilip Herron <herron.philip@googlemail.com>2021-01-09 14:47:50 +0000
commit0f42a240e53e932de0ae4799d54fe0bd15d06047 (patch)
treeefc00c63fd2ec4f1fe1bcb890b82e80240be9c4d /gcc
parent6d7a53b684b5765acda82f39f71bc7798bf0ee94 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h27
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc3
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 &param : 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 ();
}