From 31d9cc3833a30b0cd4c1554102402af68eebeeef Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Fri, 23 Dec 2016 02:16:31 +0000 Subject: [PATCH] Fix import resolution bug and fold all idents in the AST. --- src/librustc_resolve/resolve_imports.rs | 3 +-- src/libsyntax/fold.rs | 29 ++++++++++++------------- src/test/run-pass/issue-38556.rs | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 src/test/run-pass/issue-38556.rs diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 8bc0bfb41ff75..5972f2d87c44c 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -128,6 +128,7 @@ impl<'a> NameResolution<'a> { impl<'a> Resolver<'a> { fn resolution(&self, module: Module<'a>, ident: Ident, ns: Namespace) -> &'a RefCell> { + let ident = ident.unhygienize(); *module.resolutions.borrow_mut().entry((ident, ns)) .or_insert_with(|| self.arenas.alloc_name_resolution()) } @@ -141,7 +142,6 @@ impl<'a> Resolver<'a> { ignore_unresolved_invocations: bool, record_used: Option) -> Result<&'a NameBinding<'a>, Determinacy> { - let ident = ident.unhygienize(); self.populate_module_if_necessary(module); let resolution = self.resolution(module, ident, ns) @@ -307,7 +307,6 @@ impl<'a> Resolver<'a> { ns: Namespace, binding: &'a NameBinding<'a>) -> Result<(), &'a NameBinding<'a>> { - let ident = ident.unhygienize(); self.update_resolution(module, ident, ns, |this, resolution| { if let Some(old_binding) = resolution.binding { if binding.is_glob_import() { diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index b3753e3e977e3..6f93819727598 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -302,23 +302,22 @@ pub fn noop_fold_view_path(view_path: P, fld: &mut T) -> P< view_path.map(|Spanned {node, span}| Spanned { node: match node { ViewPathSimple(ident, path) => { - ViewPathSimple(ident, fld.fold_path(path)) + ViewPathSimple(fld.fold_ident(ident), fld.fold_path(path)) } ViewPathGlob(path) => { ViewPathGlob(fld.fold_path(path)) } ViewPathList(path, path_list_idents) => { - ViewPathList(fld.fold_path(path), - path_list_idents.move_map(|path_list_ident| { - Spanned { - node: PathListItem_ { - id: fld.new_id(path_list_ident.node.id), - rename: path_list_ident.node.rename, - name: path_list_ident.node.name, - }, - span: fld.new_span(path_list_ident.span) - } - })) + let path = fld.fold_path(path); + let path_list_idents = path_list_idents.move_map(|path_list_ident| Spanned { + node: PathListItem_ { + id: fld.new_id(path_list_ident.node.id), + rename: path_list_ident.node.rename.map(|ident| fld.fold_ident(ident)), + name: fld.fold_ident(path_list_ident.node.name), + }, + span: fld.new_span(path_list_ident.span) + }); + ViewPathList(path, path_list_idents) } }, span: fld.new_span(span) @@ -345,7 +344,7 @@ pub fn noop_fold_arm(Arm {attrs, pats, guard, body}: Arm, fld: &mut T pub fn noop_fold_ty_binding(b: TypeBinding, fld: &mut T) -> TypeBinding { TypeBinding { id: fld.new_id(b.id), - ident: b.ident, + ident: fld.fold_ident(b.ident), ty: fld.fold_ty(b.ty), span: fld.new_span(b.span), } @@ -673,7 +672,7 @@ pub fn noop_fold_ty_param(tp: TyParam, fld: &mut T) -> TyParam { .collect::>() .into(), id: fld.new_id(id), - ident: ident, + ident: fld.fold_ident(ident), bounds: fld.fold_bounds(bounds), default: default.map(|x| fld.fold_ty(x)), span: span @@ -1088,7 +1087,7 @@ pub fn noop_fold_pat(p: P, folder: &mut T) -> P { let fs = fields.move_map(|f| { Spanned { span: folder.new_span(f.span), node: ast::FieldPat { - ident: f.node.ident, + ident: folder.fold_ident(f.node.ident), pat: folder.fold_pat(f.node.pat), is_shorthand: f.node.is_shorthand, }} diff --git a/src/test/run-pass/issue-38556.rs b/src/test/run-pass/issue-38556.rs new file mode 100644 index 0000000000000..f6f334f650b24 --- /dev/null +++ b/src/test/run-pass/issue-38556.rs @@ -0,0 +1,22 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub struct Foo; + +macro_rules! reexport { + () => { use Foo as Bar; } +} + +reexport!(); + +fn main() { + use Bar; + fn f(_: Bar) {} +}