aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-26 17:34:02 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-07-26 17:38:51 +0100
commit5f238bc0fdc083a692a72a39ab1d5890dbb6f338 (patch)
tree4d46ebe04691b12dcbc4ffcdbe1939bdf42a85fe /gcc/rust/resolve
parent5b3909dd7487ddd41ffacf45150a4fff550e2fab (diff)
downloadgcc-5f238bc0fdc083a692a72a39ab1d5890dbb6f338.zip
gcc-5f238bc0fdc083a692a72a39ab1d5890dbb6f338.tar.gz
gcc-5f238bc0fdc083a692a72a39ab1d5890dbb6f338.tar.bz2
Add name-resolution and HIR lowering for extern blocks
This is the initial patch to do the ground work to support extern blocks. Type resolution and Generic output still needs to be done to actually support extern blocks. Addresses #421
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-implitem.h53
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h49
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-toplevel.h8
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc4
4 files changed, 114 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-implitem.h b/gcc/rust/resolve/rust-ast-resolve-implitem.h
index 2b3a09a..6437be2 100644
--- a/gcc/rust/resolve/rust-ast-resolve-implitem.h
+++ b/gcc/rust/resolve/rust-ast-resolve-implitem.h
@@ -201,6 +201,59 @@ private:
const CanonicalPath &prefix;
};
+class ResolveToplevelExternItem : public ResolverBase
+{
+ using Rust::Resolver::ResolverBase::visit;
+
+public:
+ static void go (AST::ExternalItem *item,
+ const CanonicalPath &prefix = CanonicalPath::create_empty ())
+ {
+ ResolveToplevelExternItem resolver (prefix);
+ item->accept_vis (resolver);
+ };
+
+ void visit (AST::ExternalFunctionItem &function) override
+ {
+ auto path
+ = prefix.append (CanonicalPath::new_seg (function.get_node_id (),
+ function.get_identifier ()));
+ resolver->get_name_scope ().insert (
+ path, function.get_node_id (), function.get_locus (), false,
+ [&] (const CanonicalPath &, NodeId, Location locus) -> void {
+ RichLocation r (function.get_locus ());
+ r.add_range (locus);
+ rust_error_at (r, "redefined multiple times");
+ });
+ resolver->insert_new_definition (function.get_node_id (),
+ Definition{function.get_node_id (),
+ function.get_node_id ()});
+ }
+
+ void visit (AST::ExternalStaticItem &item) override
+ {
+ auto path = prefix.append (
+ CanonicalPath::new_seg (item.get_node_id (), item.get_identifier ()));
+ resolver->get_name_scope ().insert (
+ path, item.get_node_id (), item.get_locus (), false,
+ [&] (const CanonicalPath &, NodeId, Location locus) -> void {
+ RichLocation r (item.get_locus ());
+ r.add_range (locus);
+ rust_error_at (r, "redefined multiple times");
+ });
+ resolver->insert_new_definition (item.get_node_id (),
+ Definition{item.get_node_id (),
+ item.get_node_id ()});
+ }
+
+private:
+ ResolveToplevelExternItem (const CanonicalPath &prefix)
+ : ResolverBase (UNKNOWN_NODEID), prefix (prefix)
+ {}
+
+ const CanonicalPath &prefix;
+};
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h
index 0714f5d..ccf3872 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.h
+++ b/gcc/rust/resolve/rust-ast-resolve-item.h
@@ -521,10 +521,19 @@ public:
resolver->get_name_scope ().pop ();
}
+ void visit (AST::ExternBlock &extern_block) override
+ {
+ for (auto &item : extern_block.get_extern_items ())
+ {
+ resolve_extern_item (item.get ());
+ }
+ }
+
protected:
void resolve_impl_item (AST::TraitImplItem *item, const CanonicalPath &self);
void resolve_impl_item (AST::InherentImplItem *item,
const CanonicalPath &self);
+ void resolve_extern_item (AST::ExternalItem *item);
ResolveItem () : ResolverBase (UNKNOWN_NODEID) {}
};
@@ -572,6 +581,46 @@ private:
const CanonicalPath &self;
};
+class ResolveExternItem : public ResolverBase
+{
+ using Rust::Resolver::ResolverBase::visit;
+
+public:
+ static void go (AST::ExternalItem *item)
+ {
+ ResolveExternItem resolver;
+ item->accept_vis (resolver);
+ };
+
+ void visit (AST::ExternalFunctionItem &function) override
+ {
+ if (function.has_generics ())
+ {
+ for (auto &generic : function.get_generic_params ())
+ ResolveGenericParam::go (generic.get (), function.get_node_id ());
+ }
+
+ if (function.has_return_type ())
+ ResolveType::go (function.get_return_type ().get (),
+ function.get_node_id ());
+
+ // 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 ());
+ }
+ }
+
+ void visit (AST::ExternalStaticItem &item) override
+ {
+ ResolveType::go (item.get_type ().get (), item.get_node_id ());
+ }
+
+private:
+ ResolveExternItem () : ResolverBase (UNKNOWN_NODEID) {}
+}; // namespace Resolver
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
index 9abbb18..a042f5c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h
+++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
@@ -191,6 +191,14 @@ public:
ResolveTopLevelTraitItems::go (item.get (), path);
}
+ void visit (AST::ExternBlock &extern_block) override
+ {
+ for (auto &item : extern_block.get_extern_items ())
+ {
+ ResolveToplevelExternItem::go (item.get (), prefix);
+ }
+ }
+
private:
ResolveTopLevel (const CanonicalPath &prefix)
: ResolverBase (UNKNOWN_NODEID), prefix (prefix)
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 18047db..9cc833f 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -635,5 +635,9 @@ ResolveItem::resolve_impl_item (AST::InherentImplItem *item,
ResolveImplItems::go (item, self);
}
+void
+ResolveItem::resolve_extern_item (AST::ExternalItem *item)
+{}
+
} // namespace Resolver
} // namespace Rust