aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h3
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-unused.h1
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc37
-rw-r--r--gcc/rust/resolve/rust-name-resolver.h15
4 files changed, 55 insertions, 1 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h
index 8b6227e..f5dc579 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.h
+++ b/gcc/rust/resolve/rust-ast-resolve-item.h
@@ -88,8 +88,10 @@ public:
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->get_label_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 ());
+ resolver->push_new_label_rib (resolver->get_type_scope ().peek ());
// we make a new scope so the names of parameters are resolved and shadowed
// correctly
@@ -111,6 +113,7 @@ public:
resolver->get_name_scope ().pop ();
resolver->get_type_scope ().pop ();
+ resolver->get_label_scope ().pop ();
}
void visit (AST::InherentImpl &impl_block)
diff --git a/gcc/rust/resolve/rust-ast-resolve-unused.h b/gcc/rust/resolve/rust-ast-resolve-unused.h
index 928cf11..748f972 100644
--- a/gcc/rust/resolve/rust-ast-resolve-unused.h
+++ b/gcc/rust/resolve/rust-ast-resolve-unused.h
@@ -43,6 +43,7 @@ public:
auto resolver = Resolver::get ();
resolver->iterate_name_ribs ([&] (Rib *r) -> void { ScanRib (r); });
resolver->iterate_type_ribs ([&] (Rib *r) -> void { ScanRib (r); });
+ resolver->iterate_label_ribs ([&] (Rib *r) -> void { ScanRib (r); });
}
};
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 593a732..0ed2bfb 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -49,7 +49,8 @@ namespace Resolver {
Resolver::Resolver ()
: mappings (Analysis::Mappings::get ()), tyctx (TypeCheckContext::get ()),
name_scope (Scope (mappings->get_current_crate ())),
- type_scope (Scope (mappings->get_current_crate ()))
+ type_scope (Scope (mappings->get_current_crate ())),
+ label_scope (Scope (mappings->get_current_crate ()))
{
generate_builtins ();
}
@@ -81,6 +82,13 @@ Resolver::push_new_type_rib (Rib *r)
type_ribs[r->get_node_id ()] = r;
}
+void
+Resolver::push_new_label_rib (Rib *r)
+{
+ rust_assert (label_ribs.find (r->get_node_id ()) == label_ribs.end ());
+ label_ribs[r->get_node_id ()] = r;
+}
+
bool
Resolver::find_name_rib (NodeId id, Rib **rib)
{
@@ -238,6 +246,27 @@ Resolver::lookup_resolved_type (NodeId refId, NodeId *defId)
return true;
}
+void
+Resolver::insert_resolved_label (NodeId refId, NodeId defId)
+{
+ auto it = resolved_labels.find (refId);
+ rust_assert (it == resolved_labels.end ());
+
+ resolved_types[refId] = defId;
+ get_label_scope ().append_reference_for_def (refId, defId);
+}
+
+bool
+Resolver::lookup_resolved_label (NodeId refId, NodeId *defId)
+{
+ auto it = resolved_labels.find (refId);
+ if (it == resolved_labels.end ())
+ return false;
+
+ *defId = it->second;
+ return true;
+}
+
// NameResolution
NameResolution *
@@ -275,6 +304,9 @@ NameResolution::go (AST::Crate &crate)
// setup parent scoping for new types
resolver->get_type_scope ().push (mappings->get_next_node_id ());
resolver->push_new_type_rib (resolver->get_type_scope ().peek ());
+ // setup label scope
+ resolver->get_label_scope ().push (mappings->get_next_node_id ());
+ resolver->push_new_label_rib (resolver->get_type_scope ().peek ());
// first gather the top-level namespace names then we drill down
for (auto it = crate.items.begin (); it != crate.items.end (); it++)
@@ -293,8 +325,10 @@ ResolveExpr::visit (AST::BlockExpr &expr)
NodeId scope_node_id = expr.get_node_id ();
resolver->get_name_scope ().push (scope_node_id);
resolver->get_type_scope ().push (scope_node_id);
+ resolver->get_label_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 ());
+ resolver->push_new_label_rib (resolver->get_type_scope ().peek ());
expr.iterate_stmts ([&] (AST::Stmt *s) mutable -> bool {
ResolveStmt::go (s, s->get_node_id ());
@@ -306,6 +340,7 @@ ResolveExpr::visit (AST::BlockExpr &expr)
resolver->get_name_scope ().pop ();
resolver->get_type_scope ().pop ();
+ resolver->get_label_scope ().pop ();
}
// rust-ast-resolve-struct-expr-field.h
diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h
index ea0e4f5..9c01d47 100644
--- a/gcc/rust/resolve/rust-name-resolver.h
+++ b/gcc/rust/resolve/rust-name-resolver.h
@@ -250,9 +250,11 @@ public:
void push_new_name_rib (Rib *r);
void push_new_type_rib (Rib *r);
+ void push_new_label_rib (Rib *r);
bool find_name_rib (NodeId id, Rib **rib);
bool find_type_rib (NodeId id, Rib **rib);
+ bool find_label_rib (NodeId id, Rib **rib);
void insert_new_definition (NodeId id, Definition def);
bool lookup_definition (NodeId id, Definition *def);
@@ -263,9 +265,13 @@ public:
void insert_resolved_type (NodeId refId, NodeId defId);
bool lookup_resolved_type (NodeId refId, NodeId *defId);
+ void insert_resolved_label (NodeId refId, NodeId defId);
+ bool lookup_resolved_label (NodeId refId, NodeId *defId);
+
// proxy for scoping
Scope &get_name_scope () { return name_scope; }
Scope &get_type_scope () { return type_scope; }
+ Scope &get_label_scope () { return label_scope; }
NodeId get_global_type_node_id () { return global_type_node_id; }
@@ -320,6 +326,12 @@ public:
}
}
+ void iterate_label_ribs (std::function<void (Rib *)> cb)
+ {
+ for (auto it = label_ribs.begin (); it != label_ribs.end (); it++)
+ cb (it->second);
+ }
+
private:
Resolver ();
@@ -332,6 +344,7 @@ private:
Scope name_scope;
Scope type_scope;
+ Scope label_scope;
NodeId global_type_node_id;
NodeId unit_ty_node_id;
@@ -339,6 +352,7 @@ private:
// map a AST Node to a Rib
std::map<NodeId, Rib *> name_ribs;
std::map<NodeId, Rib *> type_ribs;
+ std::map<NodeId, Rib *> label_ribs;
// map any Node to its Definition
// ie any name or type usage
@@ -354,6 +368,7 @@ private:
// we need two namespaces one for names and ones for types
std::map<NodeId, NodeId> resolved_names;
std::map<NodeId, NodeId> resolved_types;
+ std::map<NodeId, NodeId> resolved_labels;
// map of resolved names mutability flag
std::map<NodeId, bool> decl_mutability;