aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Poulhiès <dkm@kataplop.net>2021-08-12 13:44:10 +0200
committerMarc <dkm@kataplop.net>2021-08-18 22:59:37 +0200
commit37a6b4ae78070b136d86bb0a7f207b8c2af69383 (patch)
tree1541dd2e9fce058c9ea9d97eff145469b1f072da
parent76ed248287c256e306f561a2de166114666743e8 (diff)
downloadgcc-37a6b4ae78070b136d86bb0a7f207b8c2af69383.zip
gcc-37a6b4ae78070b136d86bb0a7f207b8c2af69383.tar.gz
gcc-37a6b4ae78070b136d86bb0a7f207b8c2af69383.tar.bz2
resolve: add support for Module
Implement required visitor methods for resolving names in modules. ref #432 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h23
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-toplevel.h21
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h3
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc18
-rw-r--r--gcc/rust/resolve/rust-name-resolver.h2
-rw-r--r--gcc/testsuite/rust/compile/torture/mod-nameresolve.rs5
6 files changed, 71 insertions, 1 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h
index c67121d..bc05e93 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.h
+++ b/gcc/rust/resolve/rust-ast-resolve-item.h
@@ -19,8 +19,10 @@
#ifndef RUST_AST_RESOLVE_ITEM_H
#define RUST_AST_RESOLVE_ITEM_H
+#include "rust-ast-full-decls.h"
#include "rust-ast-resolve-base.h"
#include "rust-ast-full.h"
+#include "rust-ast-resolve-toplevel.h"
#include "rust-ast-resolve-type.h"
#include "rust-ast-resolve-pattern.h"
#include "rust-ast-resolve-stmt.h"
@@ -214,6 +216,27 @@ public:
resolver->get_type_scope ().pop ();
}
+ void visit (AST::Module &module) override
+ {
+ NodeId scope_node_id = module.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 ());
+
+ for (auto &item : module.get_items ())
+ ResolveTopLevel::go (item.get ());
+
+ for (auto &item : module.get_items ())
+ ResolveItem::go (item.get ());
+
+ resolver->get_name_scope ().pop ();
+ resolver->get_type_scope ().pop ();
+ resolver->get_label_scope ().pop ();
+ }
+
void visit (AST::TupleStruct &struct_decl) override
{
NodeId scope_node_id = struct_decl.get_node_id ();
diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
index 57a0534..2c1de66 100644
--- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h
+++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
@@ -23,6 +23,7 @@
#include "rust-ast-resolve-type.h"
#include "rust-ast-resolve-implitem.h"
#include "rust-ast-full.h"
+#include "rust-name-resolver.h"
namespace Rust {
namespace Resolver {
@@ -39,6 +40,26 @@ public:
item->accept_vis (resolver);
};
+ void visit (AST::Module &module) override
+ {
+ auto path = prefix.append (
+ CanonicalPath::new_seg (module.get_node_id (), module.get_name ()));
+ resolver->get_name_scope ().insert (
+ path, module.get_node_id (), module.get_locus (), false,
+ [&] (const CanonicalPath &, NodeId, Location locus) -> void {
+ RichLocation r (module.get_locus ());
+ r.add_range (locus);
+ rust_error_at (r, "redefined multiple times");
+ });
+
+ resolver->insert_new_definition (module.get_node_id (),
+ Definition{module.get_node_id (),
+ module.get_node_id ()});
+
+ for (auto &item : module.get_items ())
+ ResolveTopLevel::go (item.get (), path);
+ }
+
void visit (AST::TypeAlias &alias) override
{
auto path
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index 49f1332..b8affe6 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -206,6 +206,9 @@ public:
auto resolver = Resolver::get ();
NodeId resolved_node = UNKNOWN_NODEID;
+
+ // We may need to change how names are resolved, like described in :
+ // https://github.com/rust-lang/rust/blob/1f94abcda6884893d4723304102089198caa0839/compiler/rustc_resolve/src/lib.rs#L1722
if (!resolver->get_type_scope ().lookup (canonical_path, &resolved_node))
{
rust_error_at (path.get_locus_slow (), "failed to resolve TypePath: %s",
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 1b77ae2..5b24816 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -552,6 +552,10 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
auto s = ResolvePathSegmentToCanonicalPath::resolve (seg);
path = path.append (s);
+ // reset state
+ segment_is_type = false;
+ resolved_node = UNKNOWN_NODEID;
+
if (resolver->get_name_scope ().lookup (path, &resolved_node))
{
resolver->insert_resolved_name (seg.get_node_id (), resolved_node);
@@ -562,6 +566,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
// check the type scope
else if (resolver->get_type_scope ().lookup (path, &resolved_node))
{
+ segment_is_type = true;
resolver->insert_resolved_type (seg.get_node_id (), resolved_node);
resolver->insert_new_definition (seg.get_node_id (),
Definition{expr->get_node_id (),
@@ -611,6 +616,19 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
return;
}
}
+
+ // its fully resolved lets mark it as such
+ if (resolved_node != UNKNOWN_NODEID)
+ {
+ if (segment_is_type)
+ resolver->insert_resolved_type (expr->get_node_id (), resolved_node);
+ else
+ resolver->insert_resolved_name (expr->get_node_id (), resolved_node);
+
+ resolver->insert_new_definition (expr->get_node_id (),
+ Definition{expr->get_node_id (),
+ parent});
+ }
}
// rust-ast-resolve-type.h
diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h
index 6fac3d3..69da4a69 100644
--- a/gcc/rust/resolve/rust-name-resolver.h
+++ b/gcc/rust/resolve/rust-name-resolver.h
@@ -30,7 +30,7 @@ namespace Resolver {
class Rib
{
public:
- // Rusts uses local_def_ids assigned by def_collector on the AST
+ // Rust uses local_def_ids assigned by def_collector on the AST
// lets use NodeId instead
Rib (CrateNum crateNum, NodeId node_id)
: crate_num (crateNum), node_id (node_id)
diff --git a/gcc/testsuite/rust/compile/torture/mod-nameresolve.rs b/gcc/testsuite/rust/compile/torture/mod-nameresolve.rs
new file mode 100644
index 0000000..218095c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/mod-nameresolve.rs
@@ -0,0 +1,5 @@
+mod foo { // { dg-warning "unused name" }
+ struct A; // { dg-warning "unused name" }
+}
+
+fn main() {}