about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPietro Albini <pietro@pietroalbini.org>2018-11-25 17:05:12 +0100
committerGitHub <noreply@github.com>2018-11-25 17:05:12 +0100
commitcd17b1d4b684df5fb04d0ee08342446463d20b18 (patch)
treedc2e1499910466e79efee5f35d7e60fd578d4d1b
parentbaf45d6d9001baeb7dfded52a6695266a8d631d0 (diff)
parentfe548e311a8f3a2e193989dc959841874738423f (diff)
downloadrust-cd17b1d4b684df5fb04d0ee08342446463d20b18.tar.gz
rust-cd17b1d4b684df5fb04d0ee08342446463d20b18.zip
Rollup merge of #56211 - petrochenkov:fwd, r=petrochenkov
[master] Forward-ports from beta

https://github.com/rust-lang/rust/pull/56206 + one commit from https://github.com/rust-lang/rust/pull/55884 that was accidentally missing in https://github.com/rust-lang/rust/pull/56042 due to an off-by-one mistake in commit ranges

r? @ghost
-rw-r--r--src/librustc_resolve/lib.rs23
-rw-r--r--src/librustc_resolve/resolve_imports.rs3
-rw-r--r--src/test/ui/imports/auxiliary/issue-56125.rs2
-rw-r--r--src/test/ui/imports/issue-56125.rs25
-rw-r--r--src/test/ui/imports/issue-56125.stderr59
-rw-r--r--src/test/ui/issues/issue-45829/import-self.rs3
-rw-r--r--src/test/ui/issues/issue-45829/import-self.stderr20
-rw-r--r--src/test/ui/privacy/restricted/relative-2018.rs13
-rw-r--r--src/test/ui/privacy/restricted/relative-2018.stderr16
9 files changed, 129 insertions, 35 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 12dabd2a31d..443b1ccdef8 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -4710,7 +4710,18 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
                 ty::Visibility::Restricted(self.current_module.normal_ancestor_id)
             }
             ast::VisibilityKind::Restricted { ref path, id, .. } => {
-                // Visibilities are resolved as global by default, add starting root segment.
+                // For visibilities we are not ready to provide correct implementation of "uniform
+                // paths" right now, so on 2018 edition we only allow module-relative paths for now.
+                let first_ident = path.segments[0].ident;
+                if self.session.rust_2018() && !first_ident.is_path_segment_keyword() {
+                    let msg = "relative paths are not supported in visibilities on 2018 edition";
+                    self.session.struct_span_err(first_ident.span, msg)
+                                .span_suggestion(path.span, "try", format!("crate::{}", path))
+                                .emit();
+                    return ty::Visibility::Public;
+                }
+                // On 2015 visibilities are resolved as crate-relative by default,
+                // add starting root segment if necessary.
                 let segments = path.make_root().iter().chain(path.segments.iter())
                     .map(|seg| Segment { ident: seg.ident, id: Some(seg.id) })
                     .collect::<Vec<_>>();
@@ -4988,10 +4999,10 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
                 err.span_suggestion_with_applicability(
                     binding.span,
                     &rename_msg,
-                    match (&directive.subclass, snippet.as_ref()) {
-                        (ImportDirectiveSubclass::SingleImport { .. }, "self") =>
+                    match directive.subclass {
+                        ImportDirectiveSubclass::SingleImport { type_ns_only: true, .. } =>
                             format!("self as {}", suggested_name),
-                        (ImportDirectiveSubclass::SingleImport { source, .. }, _) =>
+                        ImportDirectiveSubclass::SingleImport { source, .. } =>
                             format!(
                                 "{} as {}{}",
                                 &snippet[..((source.span.hi().0 - binding.span.lo().0) as usize)],
@@ -5002,13 +5013,13 @@ impl<'a, 'crateloader: 'a> Resolver<'a, 'crateloader> {
                                     ""
                                 }
                             ),
-                        (ImportDirectiveSubclass::ExternCrate { source, target, .. }, _) =>
+                        ImportDirectiveSubclass::ExternCrate { source, target, .. } =>
                             format!(
                                 "extern crate {} as {};",
                                 source.unwrap_or(target.name),
                                 suggested_name,
                             ),
-                        (_, _) => unreachable!(),
+                        _ => unreachable!(),
                     },
                     Applicability::MaybeIncorrect,
                 );
diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs
index 616cc9d2fc5..52e3e54b9f9 100644
--- a/src/librustc_resolve/resolve_imports.rs
+++ b/src/librustc_resolve/resolve_imports.rs
@@ -864,7 +864,8 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
             }
             PathResult::NonModule(path_res) if path_res.base_def() == Def::Err => {
                 // The error was already reported earlier.
-                assert!(directive.imported_module.get().is_none());
+                assert!(!self.ambiguity_errors.is_empty() ||
+                        directive.imported_module.get().is_none());
                 return None;
             }
             PathResult::Indeterminate | PathResult::NonModule(..) => unreachable!(),
diff --git a/src/test/ui/imports/auxiliary/issue-56125.rs b/src/test/ui/imports/auxiliary/issue-56125.rs
index 0ff407756b3..8e079758297 100644
--- a/src/test/ui/imports/auxiliary/issue-56125.rs
+++ b/src/test/ui/imports/auxiliary/issue-56125.rs
@@ -1,3 +1,5 @@
+pub mod issue_56125 {}
+
 pub mod last_segment {
     pub mod issue_56125 {}
 }
diff --git a/src/test/ui/imports/issue-56125.rs b/src/test/ui/imports/issue-56125.rs
index 4baeb8a34dd..843b52f1843 100644
--- a/src/test/ui/imports/issue-56125.rs
+++ b/src/test/ui/imports/issue-56125.rs
@@ -2,11 +2,24 @@
 // compile-flags:--extern issue_56125
 // aux-build:issue-56125.rs
 
-use issue_56125::last_segment::*;
-//~^ ERROR `issue_56125` is ambiguous
-//~| ERROR unresolved import `issue_56125::last_segment`
-use issue_56125::non_last_segment::non_last_segment::*;
-//~^ ERROR `issue_56125` is ambiguous
-//~| ERROR failed to resolve: could not find `non_last_segment` in `issue_56125`
+#![feature(uniform_paths)]
+
+mod m1 {
+    use issue_56125::last_segment::*;
+    //~^ ERROR `issue_56125` is ambiguous
+    //~| ERROR unresolved import `issue_56125::last_segment`
+}
+
+mod m2 {
+    use issue_56125::non_last_segment::non_last_segment::*;
+    //~^ ERROR `issue_56125` is ambiguous
+    //~| ERROR failed to resolve: could not find `non_last_segment` in `issue_56125`
+}
+
+mod m3 {
+    mod empty {}
+    use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125`
+    use issue_56125::*; //~ ERROR `issue_56125` is ambiguous
+}
 
 fn main() {}
diff --git a/src/test/ui/imports/issue-56125.stderr b/src/test/ui/imports/issue-56125.stderr
index 096d5be97f0..b1292ef8f78 100644
--- a/src/test/ui/imports/issue-56125.stderr
+++ b/src/test/ui/imports/issue-56125.stderr
@@ -1,46 +1,67 @@
 error[E0433]: failed to resolve: could not find `non_last_segment` in `issue_56125`
-  --> $DIR/issue-56125.rs:8:18
+  --> $DIR/issue-56125.rs:14:22
    |
-LL | use issue_56125::non_last_segment::non_last_segment::*;
-   |                  ^^^^^^^^^^^^^^^^ could not find `non_last_segment` in `issue_56125`
+LL |     use issue_56125::non_last_segment::non_last_segment::*;
+   |                      ^^^^^^^^^^^^^^^^ could not find `non_last_segment` in `issue_56125`
 
 error[E0432]: unresolved import `issue_56125::last_segment`
-  --> $DIR/issue-56125.rs:5:18
+  --> $DIR/issue-56125.rs:8:22
    |
-LL | use issue_56125::last_segment::*;
-   |                  ^^^^^^^^^^^^ could not find `last_segment` in `issue_56125`
+LL |     use issue_56125::last_segment::*;
+   |                      ^^^^^^^^^^^^ could not find `last_segment` in `issue_56125`
+
+error[E0432]: unresolved import `empty::issue_56125`
+  --> $DIR/issue-56125.rs:21:9
+   |
+LL |     use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125`
+   |         ^^^^^^^^^^^^^^^^^^ no `issue_56125` in `m3::empty`
 
 error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution)
-  --> $DIR/issue-56125.rs:5:5
+  --> $DIR/issue-56125.rs:8:9
    |
-LL | use issue_56125::last_segment::*;
-   |     ^^^^^^^^^^^ ambiguous name
+LL |     use issue_56125::last_segment::*;
+   |         ^^^^^^^^^^^ ambiguous name
    |
    = note: `issue_56125` could refer to an extern crate passed with `--extern`
    = help: use `::issue_56125` to refer to this extern crate unambiguously
 note: `issue_56125` could also refer to the module imported here
-  --> $DIR/issue-56125.rs:5:5
+  --> $DIR/issue-56125.rs:8:9
    |
-LL | use issue_56125::last_segment::*;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     use issue_56125::last_segment::*;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    = help: use `self::issue_56125` to refer to this module unambiguously
 
 error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution)
-  --> $DIR/issue-56125.rs:8:5
+  --> $DIR/issue-56125.rs:14:9
    |
-LL | use issue_56125::non_last_segment::non_last_segment::*;
-   |     ^^^^^^^^^^^ ambiguous name
+LL |     use issue_56125::non_last_segment::non_last_segment::*;
+   |         ^^^^^^^^^^^ ambiguous name
    |
    = note: `issue_56125` could refer to an extern crate passed with `--extern`
    = help: use `::issue_56125` to refer to this extern crate unambiguously
 note: `issue_56125` could also refer to the module imported here
-  --> $DIR/issue-56125.rs:5:5
+  --> $DIR/issue-56125.rs:14:9
    |
-LL | use issue_56125::last_segment::*;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     use issue_56125::non_last_segment::non_last_segment::*;
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    = help: use `self::issue_56125` to refer to this module unambiguously
 
-error: aborting due to 4 previous errors
+error[E0659]: `issue_56125` is ambiguous (name vs any other name during import resolution)
+  --> $DIR/issue-56125.rs:22:9
+   |
+LL |     use issue_56125::*; //~ ERROR `issue_56125` is ambiguous
+   |         ^^^^^^^^^^^ ambiguous name
+   |
+   = note: `issue_56125` could refer to an extern crate passed with `--extern`
+   = help: use `::issue_56125` to refer to this extern crate unambiguously
+note: `issue_56125` could also refer to the unresolved item imported here
+  --> $DIR/issue-56125.rs:21:9
+   |
+LL |     use empty::issue_56125; //~ ERROR unresolved import `empty::issue_56125`
+   |         ^^^^^^^^^^^^^^^^^^
+   = help: use `self::issue_56125` to refer to this unresolved item unambiguously
+
+error: aborting due to 6 previous errors
 
 Some errors occurred: E0432, E0433, E0659.
 For more information about an error, try `rustc --explain E0432`.
diff --git a/src/test/ui/issues/issue-45829/import-self.rs b/src/test/ui/issues/issue-45829/import-self.rs
index 8b13ffd0076..eb5fb458d82 100644
--- a/src/test/ui/issues/issue-45829/import-self.rs
+++ b/src/test/ui/issues/issue-45829/import-self.rs
@@ -19,4 +19,7 @@ use foo as self;
 
 use foo::self;
 
+use foo::A;
+use foo::{self as A};
+
 fn main() {}
diff --git a/src/test/ui/issues/issue-45829/import-self.stderr b/src/test/ui/issues/issue-45829/import-self.stderr
index 985dc4e7131..55e51952a88 100644
--- a/src/test/ui/issues/issue-45829/import-self.stderr
+++ b/src/test/ui/issues/issue-45829/import-self.stderr
@@ -25,7 +25,21 @@ help: you can use `as` to change the binding name of the import
 LL | use foo::{self as other_foo};
    |           ^^^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error[E0252]: the name `A` is defined multiple times
+  --> $DIR/import-self.rs:23:11
+   |
+LL | use foo::A;
+   |     ------ previous import of the type `A` here
+LL | use foo::{self as A};
+   |           ^^^^^^^^^ `A` reimported here
+   |
+   = note: `A` must be defined only once in the type namespace of this module
+help: you can use `as` to change the binding name of the import
+   |
+LL | use foo::{self as OtherA};
+   |           ^^^^^^^^^^^^^^
+
+error: aborting due to 4 previous errors
 
-Some errors occurred: E0255, E0429.
-For more information about an error, try `rustc --explain E0255`.
+Some errors occurred: E0252, E0255, E0429.
+For more information about an error, try `rustc --explain E0252`.
diff --git a/src/test/ui/privacy/restricted/relative-2018.rs b/src/test/ui/privacy/restricted/relative-2018.rs
new file mode 100644
index 00000000000..69b7c1e4d4f
--- /dev/null
+++ b/src/test/ui/privacy/restricted/relative-2018.rs
@@ -0,0 +1,13 @@
+// edition:2018
+
+mod m {
+    pub(in crate) struct S1; // OK
+    pub(in super) struct S2; // OK
+    pub(in self) struct S3; // OK
+    pub(in ::core) struct S4;
+    //~^ ERROR visibilities can only be restricted to ancestor modules
+    pub(in a::b) struct S5;
+    //~^ ERROR relative paths are not supported in visibilities on 2018 edition
+}
+
+fn main() {}
diff --git a/src/test/ui/privacy/restricted/relative-2018.stderr b/src/test/ui/privacy/restricted/relative-2018.stderr
new file mode 100644
index 00000000000..61effc463e9
--- /dev/null
+++ b/src/test/ui/privacy/restricted/relative-2018.stderr
@@ -0,0 +1,16 @@
+error: visibilities can only be restricted to ancestor modules
+  --> $DIR/relative-2018.rs:7:12
+   |
+LL |     pub(in ::core) struct S4;
+   |            ^^^^^^
+
+error: relative paths are not supported in visibilities on 2018 edition
+  --> $DIR/relative-2018.rs:9:12
+   |
+LL |     pub(in a::b) struct S5;
+   |            ^---
+   |            |
+   |            help: try: `crate::a::b`
+
+error: aborting due to 2 previous errors
+