]> git.lizzy.rs Git - rust.git/commitdiff
Do not encode gensymed imports in metadata
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Tue, 19 Mar 2019 18:32:17 +0000 (21:32 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Tue, 19 Mar 2019 19:50:46 +0000 (22:50 +0300)
src/librustc_resolve/build_reduced_graph.rs
src/librustc_resolve/resolve_imports.rs
src/libsyntax_pos/symbol.rs
src/test/ui/imports/auxiliary/gensymed.rs [new file with mode: 0644]
src/test/ui/imports/gensymed.rs [new file with mode: 0644]

index 6fad4b2db9713c7a72382cb443b8872099836b70..f312ef216822d1c74af14aa51f6fb34c7887af7d 100644 (file)
@@ -303,7 +303,7 @@ fn build_reduced_graph_for_use_tree(
                 }
 
                 // 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 @@ fn build_reduced_graph_for_use_tree(
                             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,
                         ),
index 9daffd522bf2c3ee47ea89426b70eaf2e1c85161..bda59c6c46c8bd2a83ac2093b53cbaf152941960 100644 (file)
@@ -1295,9 +1295,11 @@ fn finalize_resolutions_in(&mut self, module: Module<'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 {
index e8d215a562e2c36a05b0a2d903bffbdf3d324822..f61aa4284d29b65030568fd0c0c8e241b78484b4 100644 (file)
@@ -179,6 +179,10 @@ pub fn gensymed(self) -> Self {
         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 (file)
index 0000000..bbb19f5
--- /dev/null
@@ -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 (file)
index 0000000..3174410
--- /dev/null
@@ -0,0 +1,7 @@
+// compile-pass
+// edition:2018
+// aux-build:gensymed.rs
+
+extern crate gensymed;
+
+fn main() {}