Skip to content

Commit 367269f

Browse files
PolygonalrCohenArthur
authored andcommitted
gccrs: Make extern crate self resolve to current crate
gcc/rust/ChangeLog: * resolve/rust-default-resolver.h (DefaultResolver): Add new visited_crates member for recursion protection. * resolve/rust-default-resolver.cc (DefaultResolver::visit(ExternCrate)): Make references of `self` resolve to the current crate. Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
1 parent 16a37ba commit 367269f

3 files changed

Lines changed: 22 additions & 2 deletions

File tree

gcc/rust/resolve/rust-default-resolver.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ namespace Resolver2_0 {
3131
void
3232
DefaultResolver::visit (AST::Crate &crate)
3333
{
34+
// Guard against infinite recursion: `extern crate self;` resolves to the
35+
// current crate, causing visit(AST::Crate) to call itself infinitely.
36+
if (!visited_crates.insert (crate.get_node_id ()).second)
37+
return;
38+
3439
auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
3540

3641
auto &mappings = Analysis::Mappings::get ();
@@ -444,7 +449,11 @@ void
444449
DefaultResolver::visit (AST::ExternCrate &crate)
445450
{
446451
auto &mappings = Analysis::Mappings::get ();
447-
auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
452+
tl::optional<CrateNum> num_opt;
453+
if (crate.get_referenced_crate () == "self")
454+
num_opt = mappings.get_current_crate ();
455+
else
456+
num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
448457

449458
if (!num_opt)
450459
{
@@ -462,7 +471,9 @@ DefaultResolver::visit (AST::ExternCrate &crate)
462471

463472
auto sub_visitor_2 = [&] () {
464473
ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
465-
crate.get_referenced_crate (),
474+
crate.get_referenced_crate () == "self"
475+
? mappings.get_current_crate_name ()
476+
: crate.get_referenced_crate (),
466477
std::move (sub_visitor_1));
467478
};
468479

gcc/rust/resolve/rust-default-resolver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#ifndef RUST_AST_DEFAULT_RESOLVER_H
2121
#define RUST_AST_DEFAULT_RESOLVER_H
2222

23+
#include "rust-system.h"
2324
#include "rust-ast-visitor.h"
2425
#include "rust-name-resolution-context.h"
2526

@@ -89,6 +90,8 @@ class DefaultResolver : public AST::DefaultASTVisitor
8990
DefaultResolver (NameResolutionContext &ctx) : ctx (ctx) {}
9091

9192
NameResolutionContext &ctx;
93+
94+
std::set<NodeId> visited_crates;
9295
};
9396

9497
} // namespace Resolver2_0
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#![feature(no_core)]
2+
#![no_core]
3+
4+
fn main() {
5+
extern crate self as my_crate;
6+
}

0 commit comments

Comments
 (0)