aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h23
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.h6
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc3
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 &param : 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 ();
}