Skip to content

Commit f9b1176

Browse files
committed
rustc_resolve: fix special-case for one-segment import paths.
1 parent cd47831 commit f9b1176

File tree

17 files changed

+433
-238
lines changed

17 files changed

+433
-238
lines changed

src/librustc_metadata/creader.rs

-28
Original file line numberDiff line numberDiff line change
@@ -1139,32 +1139,4 @@ impl<'a> CrateLoader<'a> {
11391139

11401140
cnum
11411141
}
1142-
1143-
pub fn process_use_extern(
1144-
&mut self,
1145-
name: Symbol,
1146-
span: Span,
1147-
id: ast::NodeId,
1148-
definitions: &Definitions,
1149-
) -> CrateNum {
1150-
let cnum = self.resolve_crate(
1151-
&None, name, name, None, None, span, PathKind::Crate, DepKind::Explicit
1152-
).0;
1153-
1154-
let def_id = definitions.opt_local_def_id(id).unwrap();
1155-
let path_len = definitions.def_path(def_id.index).data.len();
1156-
1157-
self.update_extern_crate(
1158-
cnum,
1159-
ExternCrate {
1160-
src: ExternCrateSource::Use,
1161-
span,
1162-
path_len,
1163-
direct: true,
1164-
},
1165-
&mut FxHashSet(),
1166-
);
1167-
1168-
cnum
1169-
}
11701142
}

src/librustc_resolve/build_reduced_graph.rs

+22-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use macros::{InvocationData, LegacyScope};
1717
use resolve_imports::ImportDirective;
1818
use resolve_imports::ImportDirectiveSubclass::{self, GlobImport, SingleImport};
1919
use {Module, ModuleData, ModuleKind, NameBinding, NameBindingKind, ToNameBinding};
20-
use {PerNS, Resolver, ResolverArenas};
20+
use {ModuleOrUniformRoot, PerNS, Resolver, ResolverArenas};
2121
use Namespace::{self, TypeNS, ValueNS, MacroNS};
2222
use {resolve_error, resolve_struct_error, ResolutionError};
2323

@@ -175,7 +175,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
175175
ModuleKind::Def(_, name) => name,
176176
ModuleKind::Block(..) => unreachable!(),
177177
};
178-
source.name = crate_name;
178+
// HACK(eddyb) unclear how good this is, but keeping `$crate`
179+
// in `source` breaks `src/test/compile-fail/import-crate-var.rs`,
180+
// while the current crate doesn't have a valid `crate_name`.
181+
if crate_name != keywords::Invalid.name() {
182+
source.name = crate_name;
183+
}
179184
if rename.is_none() {
180185
ident.name = crate_name;
181186
}
@@ -187,6 +192,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
187192
}
188193
}
189194

195+
if ident.name == keywords::Crate.name() {
196+
self.session.span_err(ident.span,
197+
"crate root imports need to be explicitly named: \
198+
`use crate as name;`");
199+
}
200+
190201
let subclass = SingleImport {
191202
target: ident,
192203
source,
@@ -299,7 +310,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
299310
root_id: item.id,
300311
id: item.id,
301312
parent,
302-
imported_module: Cell::new(Some(module)),
313+
imported_module: Cell::new(Some(ModuleOrUniformRoot::Module(module))),
303314
subclass: ImportDirectiveSubclass::ExternCrate(orig_name),
304315
root_span: item.span,
305316
span: item.span,
@@ -701,7 +712,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
701712
root_id: item.id,
702713
id: item.id,
703714
parent: graph_root,
704-
imported_module: Cell::new(Some(module)),
715+
imported_module: Cell::new(Some(ModuleOrUniformRoot::Module(module))),
705716
subclass: ImportDirectiveSubclass::MacroUse,
706717
root_span: span,
707718
span,
@@ -721,7 +732,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
721732
} else {
722733
for (name, span) in legacy_imports.imports {
723734
let ident = Ident::with_empty_ctxt(name);
724-
let result = self.resolve_ident_in_module(module, ident, MacroNS, false, span);
735+
let result = self.resolve_ident_in_module(
736+
ModuleOrUniformRoot::Module(module),
737+
ident,
738+
MacroNS,
739+
false,
740+
span,
741+
);
725742
if let Ok(binding) = result {
726743
let directive = macro_use_directive(span);
727744
self.potentially_unused_imports.push(directive);

0 commit comments

Comments
 (0)