about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2018-10-12 13:47:37 +0200
committerDavid Wood <david@davidtw.co>2018-10-19 15:45:46 +0200
commit4334aaacf1da33ece0b13d845bf280aeddcb512b (patch)
tree5aea52e86426258c9e12d6562936e5f331c5c8bc /src/test
parentb8b4150c042b06c46e29a9d12101f91fe13996e0 (diff)
downloadrust-4334aaacf1da33ece0b13d845bf280aeddcb512b.tar.gz
rust-4334aaacf1da33ece0b13d845bf280aeddcb512b.zip
Only suggest paths that exist.
In order to output a path that could actually be imported (valid and
visible), we need to handle re-exports correctly.

For example, take `std::os::unix::process::CommandExt`, this trait is
actually defined at `std::sys::unix::ext::process::CommandExt` (at time
of writing).

`std::os::unix` rexports the contents of `std::sys::unix::ext`.
`std::sys` is private so the "true" path to `CommandExt` isn't accessible.

In this case, the visible parent map will look something like this:

(child) -> (parent)
`std::sys::unix::ext::process::CommandExt` -> `std::sys::unix::ext::process`
`std::sys::unix::ext::process` -> `std::sys::unix::ext`
`std::sys::unix::ext` -> `std::os`

This is correct, as the visible parent of `std::sys::unix::ext` is in fact
`std::os`.

When printing the path to `CommandExt` and looking at the current
segment that corresponds to `std::sys::unix::ext`, we would normally
print `ext` and then go to the parent - resulting in a mangled path like
`std::os::ext::process::CommandExt`.

Instead, we must detect that there was a re-export and instead print `unix`
(which is the name `std::sys::unix::ext` was re-exported as in `std::os`).
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/issues/issue-39175.rs25
-rw-r--r--src/test/ui/issues/issue-39175.stderr15
2 files changed, 40 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-39175.rs b/src/test/ui/issues/issue-39175.rs
new file mode 100644
index 00000000000..efe59c31263
--- /dev/null
+++ b/src/test/ui/issues/issue-39175.rs
@@ -0,0 +1,25 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// This test ignores some platforms as the particular extension trait used
+// to demonstrate the issue is only available on unix. This is fine as
+// the fix to suggested paths is not platform-dependent and will apply on
+// these platforms also.
+
+// ignore-windows
+// ignore-cloudabi
+// ignore-emscripten
+
+use std::process::Command;
+// use std::os::unix::process::CommandExt;
+
+fn main() {
+    Command::new("echo").arg("hello").exec();
+}
diff --git a/src/test/ui/issues/issue-39175.stderr b/src/test/ui/issues/issue-39175.stderr
new file mode 100644
index 00000000000..f5611e2e97b
--- /dev/null
+++ b/src/test/ui/issues/issue-39175.stderr
@@ -0,0 +1,15 @@
+error[E0599]: no method named `exec` found for type `&mut std::process::Command` in the current scope
+  --> $DIR/issue-39175.rs:24:39
+   |
+LL |     Command::new("echo").arg("hello").exec();
+   |                                       ^^^^
+   |
+   = help: items from traits can only be used if the trait is in scope
+help: the following trait is implemented but not in scope, perhaps add a `use` for it:
+   |
+LL | use std::os::unix::process::CommandExt;
+   |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.