Skip to content

Commit

Permalink
Rollup merge of rust-lang#59268 - estebank:from-string, r=QuietMisdre…
Browse files Browse the repository at this point in the history
…avus

Add suggestion to use `&*var` when `&str: From<String>` is expected

Fix rust-lang#53879.
  • Loading branch information
Centril committed Mar 27, 2019
2 parents 692760d + e929d19 commit dfce933
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/doc/unstable-book/src/language-features/on-unimplemented.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,16 @@ error[E0277]: `&str` is not an iterator
= help: the trait `std::iter::Iterator` is not implemented for `&str`
= note: required by `std::iter::IntoIterator::into_iter`
```

If you need to filter on multiple attributes, you can use `all`, `any` or
`not` in the following way:

```rust,compile_fail
#[rustc_on_unimplemented(
on(
all(_Self="&str", T="std::string::String"),
note="you can coerce a `{T}` into a `{Self}` by writing `&*variable`"
)
)]
pub trait From<T>: Sized { /* ... */ }
```
6 changes: 6 additions & 0 deletions src/libcore/convert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,12 @@ pub trait Into<T>: Sized {
/// [`from`]: trait.From.html#tymethod.from
/// [book]: ../../book/ch09-00-error-handling.html
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_on_unimplemented(
on(
all(_Self="&str", T="std::string::String"),
note="to coerce a `{T}` into a `{Self}`, use `&*` as a prefix",
)
)]
pub trait From<T>: Sized {
/// Performs the conversion.
#[stable(feature = "rust1", since = "1.0.0")]
Expand Down
6 changes: 6 additions & 0 deletions src/test/ui/suggestions/into-str.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fn foo<'a, T>(_t: T) where T: Into<&'a str> {}

fn main() {
foo(String::new());
//~^ ERROR the trait bound `&str: std::convert::From<std::string::String>` is not satisfied
}
17 changes: 17 additions & 0 deletions src/test/ui/suggestions/into-str.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0277]: the trait bound `&str: std::convert::From<std::string::String>` is not satisfied
--> $DIR/into-str.rs:4:5
|
LL | foo(String::new());
| ^^^ the trait `std::convert::From<std::string::String>` is not implemented for `&str`
|
= note: to coerce a `std::string::String` into a `&str`, use `&*` as a prefix
= note: required because of the requirements on the impl of `std::convert::Into<&str>` for `std::string::String`
note: required by `foo`
--> $DIR/into-str.rs:1:1
|
LL | fn foo<'a, T>(_t: T) where T: Into<&'a str> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

0 comments on commit dfce933

Please sign in to comment.