From 30d5dc9a0ac48b7fae1e5ca79987fa004b00eec1 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Tue, 19 Mar 2019 21:32:17 +0300 Subject: [PATCH] Do not encode gensymed imports in metadata --- src/librustc_resolve/build_reduced_graph.rs | 4 ++-- src/librustc_resolve/resolve_imports.rs | 6 ++++-- src/libsyntax_pos/symbol.rs | 4 ++++ src/test/ui/imports/auxiliary/gensymed.rs | 3 +++ src/test/ui/imports/gensymed.rs | 7 +++++++ 5 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 src/test/ui/imports/auxiliary/gensymed.rs create mode 100644 src/test/ui/imports/gensymed.rs diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 6fad4b2db9713..f312ef216822d 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -303,7 +303,7 @@ impl<'a> Resolver<'a> { } // Empty groups `a::b::{}` are turned into synthetic `self` imports - // `a::b::c::{self as _}`, so that their prefixes are correctly + // `a::b::c::{self as __dummy}`, so that their prefixes are correctly // resolved and checked for privacy/stability/etc. if items.is_empty() && !empty_for_self(&prefix) { let new_span = prefix[prefix.len() - 1].ident.span; @@ -312,7 +312,7 @@ impl<'a> Resolver<'a> { Ident::new(keywords::SelfLower.name(), new_span) ), kind: ast::UseTreeKind::Simple( - Some(Ident::new(keywords::Underscore.name().gensymed(), new_span)), + Some(Ident::new(Name::gensym("__dummy"), new_span)), ast::DUMMY_NODE_ID, ast::DUMMY_NODE_ID, ), diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 9daffd522bf2c..bda59c6c46c8b 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -1295,9 +1295,11 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { None => continue, }; - // Filter away "empty import canaries" and ambiguous imports. + // Filter away ambiguous and gensymed imports. Gensymed imports + // (e.g. implicitly injected `std`) cannot be properly encoded in metadata, + // so they can cause name conflict errors downstream. let is_good_import = binding.is_import() && !binding.is_ambiguity() && - binding.vis != ty::Visibility::Invisible; + !(ident.name.is_gensymed() && ident.name != "_"); if is_good_import || binding.is_macro_def() { let def = binding.def(); if def != Def::Err { diff --git a/src/libsyntax_pos/symbol.rs b/src/libsyntax_pos/symbol.rs index e8d215a562e2c..f61aa4284d29b 100644 --- a/src/libsyntax_pos/symbol.rs +++ b/src/libsyntax_pos/symbol.rs @@ -179,6 +179,10 @@ impl Symbol { with_interner(|interner| interner.gensymed(self)) } + pub fn is_gensymed(self) -> bool { + with_interner(|interner| interner.is_gensymed(self)) + } + pub fn as_str(self) -> LocalInternedString { with_interner(|interner| unsafe { LocalInternedString { diff --git a/src/test/ui/imports/auxiliary/gensymed.rs b/src/test/ui/imports/auxiliary/gensymed.rs new file mode 100644 index 0000000000000..bbb19f5ec6519 --- /dev/null +++ b/src/test/ui/imports/auxiliary/gensymed.rs @@ -0,0 +1,3 @@ +// edition:2018 + +mod std {} diff --git a/src/test/ui/imports/gensymed.rs b/src/test/ui/imports/gensymed.rs new file mode 100644 index 0000000000000..317441079ff87 --- /dev/null +++ b/src/test/ui/imports/gensymed.rs @@ -0,0 +1,7 @@ +// compile-pass +// edition:2018 +// aux-build:gensymed.rs + +extern crate gensymed; + +fn main() {}