Skip to content

Commit ad025f2

Browse files
committed
nr: Add modules to types NS
gcc/rust/ChangeLog: * util/rust-hir-map.cc (Mappings::insert_module_id): New function. (Mappings::is_module): Likewise. * util/rust-hir-map.h: Store a set of AST modules, declare functions for adding and retrieving them. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Insert modules in the type namespace and store them in mappings. * resolve/rust-late-name-resolver-2.0.cc (resolve_type_path_like): Error out when an expected type resolves to a module. * resolve/rust-name-resolution-context.cc (NameResolutionContext::map_usage): Allow reinsertions. * resolve/rust-name-resolution-context.h: Add empty Definition constructor. * resolve/rust-resolve-builtins.cc (find_builtin_node_id): New function. * resolve/rust-resolve-builtins.h: Declare it. gcc/testsuite/ChangeLog: * rust/compile/mod_in_types_ns.rs: New test. * rust/compile/mod_in_types_ns2.rs: New test.
1 parent 145e66e commit ad025f2

10 files changed

+88
-5
lines changed

gcc/rust/resolve/rust-late-name-resolver-2.0.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,33 @@ resolve_type_path_like (NameResolutionContext &ctx, bool block_big_self,
517517
"declared identifiers");
518518
}
519519

520+
if (Analysis::Mappings::get ().is_module (resolved->get_node_id ()))
521+
{
522+
if (type.get_segments ().size () == 1)
523+
{
524+
if (auto resolved
525+
= Builtins::find_builtin_node_id (type.as_string ()))
526+
{
527+
ctx.map_usage (Usage (type.get_node_id ()),
528+
Definition (*resolved));
529+
530+
// In that specific case, we also override the segment resolution
531+
// as it causes issues later down the line during typechecking
532+
ctx.map_usage (Usage (unwrap_segment_node_id (
533+
type.get_segments ().front ())),
534+
Definition (*resolved));
535+
}
536+
else
537+
{
538+
rust_error_at (type.get_locus (), ErrorCode::E0573,
539+
"expected type, found module %qs",
540+
unwrap_segment_error_string (type).c_str ());
541+
}
542+
}
543+
544+
return;
545+
}
546+
520547
ctx.map_usage (Usage (type.get_node_id ()),
521548
Definition (resolved->get_node_id ()));
522549
}

gcc/rust/resolve/rust-name-resolution-context.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ NameResolutionContext::insert_globbed (Identifier name, NodeId id, Namespace ns)
252252
void
253253
NameResolutionContext::map_usage (Usage usage, Definition definition)
254254
{
255-
auto inserted = resolved_nodes.emplace (usage, definition).second;
255+
resolved_nodes[usage] = definition;
256256

257-
// is that valid?
258-
rust_assert (inserted);
257+
// TODO: Are reinsertions okay?
258+
// rust_assert (inserted);
259259
}
260260

261261
tl::optional<NodeId>

gcc/rust/resolve/rust-name-resolution-context.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class Usage
153153
class Definition
154154
{
155155
public:
156+
explicit Definition () : id (UNKNOWN_NODEID) {}
156157
explicit Definition (NodeId id) : id (id) {}
157158

158159
NodeId id;

gcc/rust/resolve/rust-resolve-builtins.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ setup_type_ctx ()
120120
unit_type);
121121
}
122122

123+
tl::optional<NodeId>
124+
find_builtin_node_id (const std::string &name)
125+
{
126+
for (size_t i = 0; i < builtin_count; i++)
127+
if (strcmp (name.c_str (), builtin_names[i]) == 0)
128+
return builtin_node_ids[i];
129+
130+
return tl::nullopt;
131+
}
132+
123133
} // namespace Builtins
124134
} // namespace Resolver2_0
125135
} // namespace Rust

gcc/rust/resolve/rust-resolve-builtins.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
#ifndef RUST_RESOLVE_BUILTINS_H
2020
#define RUST_RESOLVE_BUILTINS_H
2121

22+
#include "optional.h"
23+
#include "rust-ast.h"
24+
2225
namespace Rust {
2326
namespace Resolver2_0 {
2427

@@ -30,6 +33,9 @@ namespace Builtins {
3033
void setup_lang_prelude (NameResolutionContext &ctx);
3134
void setup_type_ctx ();
3235

36+
// Return the NodeId associated with a builtin type name if it exists
37+
tl::optional<NodeId> find_builtin_node_id (const std::string &name);
38+
3339
} // namespace Builtins
3440
} // namespace Resolver2_0
3541
} // namespace Rust

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,16 @@ TopLevel::go (AST::Crate &crate)
106106
void
107107
TopLevel::visit (AST::Module &module)
108108
{
109-
DefaultResolver::visit (module);
110-
111109
if (Analysis::Mappings::get ().lookup_glob_container (module.get_node_id ())
112110
== tl::nullopt)
113111
Analysis::Mappings::get ().insert_glob_container (module.get_node_id (),
114112
&module);
113+
114+
insert_or_error_out (module.get_name (), module, Namespace::Types);
115+
116+
Analysis::Mappings::get ().insert_module_id (module.get_node_id ());
117+
118+
DefaultResolver::visit (module);
115119
}
116120

117121
void

gcc/rust/util/rust-hir-map.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,18 @@ Mappings::insert_glob_container (NodeId id, AST::GlobContainer *container)
11681168
glob_containers[id] = container;
11691169
}
11701170

1171+
void
1172+
Mappings::insert_module_id (NodeId id)
1173+
{
1174+
module_ids.insert (id);
1175+
}
1176+
1177+
bool
1178+
Mappings::is_module (NodeId id)
1179+
{
1180+
return module_ids.find (id) != module_ids.end ();
1181+
}
1182+
11711183
tl::optional<AST::GlobContainer *>
11721184
Mappings::lookup_glob_container (NodeId id)
11731185
{

gcc/rust/util/rust-hir-map.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@ class Mappings
323323

324324
void insert_glob_container (NodeId, AST::GlobContainer *);
325325
tl::optional<AST::GlobContainer *> lookup_glob_container (NodeId id);
326+
327+
void insert_module_id (NodeId);
328+
bool is_module (NodeId id);
329+
326330
void insert_module_child (NodeId module, NodeId child);
327331
tl::optional<std::vector<NodeId> &> lookup_module_children (NodeId module);
328332

@@ -438,10 +442,13 @@ class Mappings
438442
// Module tree maps
439443

440444
// Maps each module's node id to a list of its children
445+
// TODO: I think these are only used by the old resolved and can be removed
441446
std::map<NodeId, std::vector<NodeId>> module_child_map;
442447
std::map<NodeId, std::vector<Resolver::CanonicalPath>> module_child_items;
443448
std::map<NodeId, NodeId> child_to_parent_module_map;
449+
444450
std::map<NodeId, AST::GlobContainer *> glob_containers;
451+
std::set<NodeId> module_ids;
445452

446453
// AST mappings
447454
std::map<NodeId, AST::Item *> ast_item_mappings;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#![feature(no_core)]
2+
#![no_core]
3+
4+
mod foo {
5+
mod bar {}
6+
7+
struct bar; // { dg-error "defined multiple times" }
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#![feature(no_core)]
2+
#![no_core]
3+
4+
mod foo {
5+
mod bar {}
6+
7+
fn baz() -> bar {} // { dg-error "expected type, found module" }
8+
}

0 commit comments

Comments
 (0)