diff options
author | Marc Poulhiès <dkm@kataplop.net> | 2021-08-12 13:44:10 +0200 |
---|---|---|
committer | Marc <dkm@kataplop.net> | 2021-08-18 22:59:37 +0200 |
commit | 37a6b4ae78070b136d86bb0a7f207b8c2af69383 (patch) | |
tree | 1541dd2e9fce058c9ea9d97eff145469b1f072da | |
parent | 76ed248287c256e306f561a2de166114666743e8 (diff) | |
download | gcc-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.h | 23 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-toplevel.h | 21 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.h | 3 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 18 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-name-resolver.h | 2 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/mod-nameresolve.rs | 5 |
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() {} |