diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-09-06 22:45:26 +0300 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-09-10 11:48:46 +0300 |
| commit | 0a33de04cfcd961a8cd2a8391dbae00cc7328a49 (patch) | |
| tree | 456177b0106bfe8b49acfb20c5833041b11a96b1 /src/librustc_resolve | |
| parent | fb945f0ebba1a6d5d0f9d0b62dedacd6c828fff7 (diff) | |
| download | rust-0a33de04cfcd961a8cd2a8391dbae00cc7328a49.tar.gz rust-0a33de04cfcd961a8cd2a8391dbae00cc7328a49.zip | |
rustc_resolve: inject `uniform_paths` canaries regardless of the feature-gate, on Rust 2018.
Diffstat (limited to 'src/librustc_resolve')
| -rw-r--r-- | src/librustc_resolve/build_reduced_graph.rs | 2 | ||||
| -rw-r--r-- | src/librustc_resolve/resolve_imports.rs | 24 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/librustc_resolve/build_reduced_graph.rs b/src/librustc_resolve/build_reduced_graph.rs index 21c0f13baa4..f97997d0dfc 100644 --- a/src/librustc_resolve/build_reduced_graph.rs +++ b/src/librustc_resolve/build_reduced_graph.rs @@ -194,7 +194,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> { // ergonomically unacceptable. let emit_uniform_paths_canary = !uniform_paths_canary_emitted && - uniform_paths && + self.session.rust_2018() && starts_with_non_keyword; if emit_uniform_paths_canary { let source = prefix_start.unwrap(); diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index f8767fa553f..9332fdb9ca2 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -705,6 +705,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> { } } + let uniform_paths_feature = self.session.features_untracked().uniform_paths; for ((span, _), (name, results)) in uniform_paths_canaries { self.per_ns(|this, ns| { let results = &results[ns]; @@ -736,15 +737,24 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> { suggestion_choices.push_str(" or "); } write!(suggestion_choices, "`self::{}`", name); - err.span_label(span, - format!("can refer to `self::{}`", name)); + if uniform_paths_feature { + err.span_label(span, + format!("can refer to `self::{}`", name)); + } else { + err.span_label(span, + format!("may refer to `self::{}` in the future", name)); + } } for &span in &results.block_scopes { err.span_label(span, format!("shadowed by block-scoped `{}`", name)); } err.help(&format!("write {} explicitly instead", suggestion_choices)); - err.note("relative `use` paths enabled by `#![feature(uniform_paths)]`"); + if uniform_paths_feature { + err.note("relative `use` paths enabled by `#![feature(uniform_paths)]`"); + } else { + err.note("in the future, `#![feature(uniform_paths)]` may become the default"); + } err.emit(); }); } @@ -930,11 +940,15 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> { _ => unreachable!(), }; + // Do not record uses from canaries, to avoid interfering with other + // diagnostics or suggestions that rely on some items not being used. + let record_used = !directive.is_uniform_paths_canary; + let mut all_ns_err = true; self.per_ns(|this, ns| if !type_ns_only || ns == TypeNS { if let Ok(binding) = result[ns].get() { all_ns_err = false; - if this.record_use(ident, ns, binding) { + if record_used && this.record_use(ident, ns, binding) { if let ModuleOrUniformRoot::Module(module) = module { this.resolution(module, ident, ns).borrow_mut().binding = Some(this.dummy_binding); @@ -946,7 +960,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> { if all_ns_err { let mut all_ns_failed = true; self.per_ns(|this, ns| if !type_ns_only || ns == TypeNS { - match this.resolve_ident_in_module(module, ident, ns, true, span) { + match this.resolve_ident_in_module(module, ident, ns, record_used, span) { Ok(_) => all_ns_failed = false, _ => {} } |
