about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-10-27 16:46:48 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2018-10-28 02:56:11 +0300
commitb45b4daba75eb6d48ebd86ac56c5ff29c3637a12 (patch)
tree4942031f153f6839fd6094d21de3e931301df590
parent171df347ff564ef4d406042227d071515e799113 (diff)
resolve: Absolute paths may be undetermined on 2018 edition
due to macro-expanded `extern crate` items adding names to extern prelude.
-rw-r--r--src/librustc_resolve/resolve_imports.rs3
-rw-r--r--src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs18
2 files changed, 21 insertions, 0 deletions
diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs
index 2b1279ba202..2faed4ad5c9 100644
--- a/src/librustc_resolve/resolve_imports.rs
+++ b/src/librustc_resolve/resolve_imports.rs
@@ -226,6 +226,9 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
                         let module = self.get_module(binding.def().def_id());
                         self.populate_module_if_necessary(module);
                         return Ok(binding);
+                    } else if !self.graph_root.unresolved_invocations.borrow().is_empty() {
+                        // Macro-expanded `extern crate`items still can add names to extern prelude.
+                        return Err(Undetermined);
                     } else {
                         return Err(Determined);
                     }
diff --git a/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs b/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs
new file mode 100644
index 00000000000..b1154f2076b
--- /dev/null
+++ b/src/test/ui/imports/extern-prelude-extern-crate-absolute-expanded.rs
@@ -0,0 +1,18 @@
+// compile-pass
+// edition:2018
+
+#![feature(extern_crate_item_prelude)]
+
+macro_rules! define_iso { () => {
+    extern crate std as iso;
+}}
+
+::iso::thread_local! {
+    static S: u8 = 0;
+}
+
+define_iso!();
+
+fn main() {
+    let s = S;
+}