self.arenas.alloc_module(module)
}
- fn record_use(&mut self, ident: Ident, ns: Namespace, binding: &'a NameBinding<'a>) {
- match binding.kind {
+ fn record_use(&mut self, ident: Ident, ns: Namespace,
+ used_binding: &'a NameBinding<'a>, is_lexical_scope: bool) {
+ match used_binding.kind {
NameBindingKind::Import { directive, binding, ref used } if !used.get() => {
+ // Avoid marking `extern crate` items that refer to a name from extern prelude,
+ // but not introduce it, as used if they are accessed from lexical scope.
+ if is_lexical_scope {
+ if let Some(entry) = self.extern_prelude.get(&ident.modern()) {
+ if let Some(crate_item) = entry.extern_crate_item {
+ if ptr::eq(used_binding, crate_item) && !entry.introduced_by_item {
+ return;
+ }
+ }
+ }
+ }
used.set(true);
directive.used.set(true);
self.used_imports.insert((directive.id, ns));
self.add_to_glob_map(directive.id, ident);
- self.record_use(ident, ns, binding);
+ self.record_use(ident, ns, binding, false);
}
NameBindingKind::Ambiguity { kind, b1, b2 } => {
self.ambiguity_errors.push(AmbiguityError {
Def::Const(..) if is_syntactic_ambiguity => {
// Disambiguate in favor of a unit struct/variant
// or constant pattern.
- self.record_use(ident, ValueNS, binding.unwrap());
+ self.record_use(ident, ValueNS, binding.unwrap(), false);
Some(PathResolution::new(def))
}
Def::StructCtor(..) | Def::VariantCtor(..) |
&parent_scope, true, true, ident.span) {
Ok(binding) => {
let initial_def = initial_binding.map(|initial_binding| {
- self.record_use(ident, MacroNS, initial_binding);
+ self.record_use(ident, MacroNS, initial_binding, false);
initial_binding.def_ignoring_ambiguity()
});
let def = binding.def_ignoring_ambiguity();
if self.last_import_segment && check_usable(self, binding).is_err() {
Err(DeterminacyExt::Determined)
} else {
- self.record_use(ident, ns, binding);
+ self.record_use(ident, ns, binding, restricted_shadowing);
if let Some(shadowed_glob) = resolution.shadowed_glob {
// Forbid expanded shadowing to avoid time travel.
// Consistency checks, analogous to `finalize_current_module_macro_resolutions`.
let initial_def = result[ns].get().map(|initial_binding| {
all_ns_err = false;
- this.record_use(ident, MacroNS, initial_binding);
+ this.record_use(ident, ns, initial_binding,
+ directive.module_path.is_empty());
initial_binding.def_ignoring_ambiguity()
});
let def = binding.def_ignoring_ambiguity();