about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTakayuki Maeda <takoyaki0316@gmail.com>2021-09-27 00:30:39 +0900
committerTakayuki Maeda <takoyaki0316@gmail.com>2021-09-27 00:30:39 +0900
commit620f480e64cb98a108d735ea4f53bb24acfc176a (patch)
tree97509e93f5b64acd926dc365696449ca114779a5
parente2aad3fe60ff97fc0d0d1a68a97211918c40b100 (diff)
downloadrust-620f480e64cb98a108d735ea4f53bb24acfc176a.tar.gz
rust-620f480e64cb98a108d735ea4f53bb24acfc176a.zip
better suggestions
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs10
-rw-r--r--src/test/ui/derives/deriving-copyclone.stderr30
-rw-r--r--src/test/ui/issues/issue-20605.stderr9
-rw-r--r--src/test/ui/suggestions/imm-ref-trait-object-literal.stderr10
-rw-r--r--src/test/ui/suggestions/issue-84973-2.stderr10
-rw-r--r--src/test/ui/suggestions/issue-84973-negative.stderr10
-rw-r--r--src/test/ui/suggestions/issue-84973.stderr10
-rw-r--r--src/test/ui/suggestions/slice-issue-87994.stderr16
-rw-r--r--src/test/ui/suggestions/suggest-both-imm-and-mut-trait-implementation.stderr4
-rw-r--r--src/test/ui/traits/negative-impls/negated-auto-traits-error.stderr14
10 files changed, 70 insertions, 53 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
index 01fa3a50d81..2a51e014713 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
@@ -781,19 +781,19 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
 
                         if imm_result && mut_result {
                             err.span_suggestions(
-                                span,
+                                span.shrink_to_lo(),
                                 "consider borrowing here",
-                                [format!("&{}", snippet), format!("&mut {}", snippet)].into_iter(),
+                                ["&".to_string(), "&mut ".to_string()].into_iter(),
                                 Applicability::MaybeIncorrect,
                             );
                         } else {
-                            err.span_suggestion(
-                                span,
+                            err.span_suggestion_verbose(
+                                span.shrink_to_lo(),
                                 &format!(
                                     "consider{} borrowing here",
                                     if mut_result { " mutably" } else { "" }
                                 ),
-                                format!("&{}{}", if mut_result { "mut " } else { "" }, snippet),
+                                format!("&{}", if mut_result { "mut " } else { "" }),
                                 Applicability::MaybeIncorrect,
                             );
                         }
diff --git a/src/test/ui/derives/deriving-copyclone.stderr b/src/test/ui/derives/deriving-copyclone.stderr
index 2538b5533a6..1d0554ad047 100644
--- a/src/test/ui/derives/deriving-copyclone.stderr
+++ b/src/test/ui/derives/deriving-copyclone.stderr
@@ -2,10 +2,8 @@ error[E0277]: the trait bound `C: Copy` is not satisfied
   --> $DIR/deriving-copyclone.rs:31:13
    |
 LL |     is_copy(B { a: 1, b: C });
-   |     ------- ^^^^^^^^^^^^^^^^
-   |     |       |
-   |     |       expected an implementor of trait `Copy`
-   |     |       help: consider borrowing here: `&B { a: 1, b: C }`
+   |     ------- ^^^^^^^^^^^^^^^^ expected an implementor of trait `Copy`
+   |     |
    |     required by a bound introduced by this call
    |
 note: required because of the requirements on the impl of `Copy` for `B<C>`
@@ -19,15 +17,17 @@ note: required by a bound in `is_copy`
 LL | fn is_copy<T: Copy>(_: T) {}
    |               ^^^^ required by this bound in `is_copy`
    = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+   |
+LL |     is_copy(&B { a: 1, b: C });
+   |             +
 
 error[E0277]: the trait bound `C: Clone` is not satisfied
   --> $DIR/deriving-copyclone.rs:32:14
    |
 LL |     is_clone(B { a: 1, b: C });
-   |     -------- ^^^^^^^^^^^^^^^^
-   |     |        |
-   |     |        expected an implementor of trait `Clone`
-   |     |        help: consider borrowing here: `&B { a: 1, b: C }`
+   |     -------- ^^^^^^^^^^^^^^^^ expected an implementor of trait `Clone`
+   |     |
    |     required by a bound introduced by this call
    |
 note: required because of the requirements on the impl of `Clone` for `B<C>`
@@ -41,15 +41,17 @@ note: required by a bound in `is_clone`
 LL | fn is_clone<T: Clone>(_: T) {}
    |                ^^^^^ required by this bound in `is_clone`
    = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+   |
+LL |     is_clone(&B { a: 1, b: C });
+   |              +
 
 error[E0277]: the trait bound `D: Copy` is not satisfied
   --> $DIR/deriving-copyclone.rs:35:13
    |
 LL |     is_copy(B { a: 1, b: D });
-   |     ------- ^^^^^^^^^^^^^^^^
-   |     |       |
-   |     |       expected an implementor of trait `Copy`
-   |     |       help: consider borrowing here: `&B { a: 1, b: D }`
+   |     ------- ^^^^^^^^^^^^^^^^ expected an implementor of trait `Copy`
+   |     |
    |     required by a bound introduced by this call
    |
 note: required because of the requirements on the impl of `Copy` for `B<D>`
@@ -63,6 +65,10 @@ note: required by a bound in `is_copy`
 LL | fn is_copy<T: Copy>(_: T) {}
    |               ^^^^ required by this bound in `is_copy`
    = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: consider borrowing here
+   |
+LL |     is_copy(&B { a: 1, b: D });
+   |             +
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/issues/issue-20605.stderr b/src/test/ui/issues/issue-20605.stderr
index ce3ab6b5998..5a67aead75a 100644
--- a/src/test/ui/issues/issue-20605.stderr
+++ b/src/test/ui/issues/issue-20605.stderr
@@ -2,10 +2,7 @@ error[E0277]: the size for values of type `dyn Iterator<Item = &'a mut u8>` cann
   --> $DIR/issue-20605.rs:2:17
    |
 LL |     for item in *things { *item = 0 }
-   |                 ^^^^^^^
-   |                 |
-   |                 expected an implementor of trait `IntoIterator`
-   |                 help: consider mutably borrowing here: `&mut *things`
+   |                 ^^^^^^^ expected an implementor of trait `IntoIterator`
    |
    = note: the trait bound `dyn Iterator<Item = &'a mut u8>: IntoIterator` is not satisfied
    = note: required because of the requirements on the impl of `IntoIterator` for `dyn Iterator<Item = &'a mut u8>`
@@ -14,6 +11,10 @@ note: required by `into_iter`
    |
 LL |     fn into_iter(self) -> Self::IntoIter;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+help: consider mutably borrowing here
+   |
+LL |     for item in &mut *things { *item = 0 }
+   |                 ++++
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/suggestions/imm-ref-trait-object-literal.stderr b/src/test/ui/suggestions/imm-ref-trait-object-literal.stderr
index 71779ecb729..001af27b248 100644
--- a/src/test/ui/suggestions/imm-ref-trait-object-literal.stderr
+++ b/src/test/ui/suggestions/imm-ref-trait-object-literal.stderr
@@ -22,10 +22,8 @@ error[E0277]: the trait bound `S: Trait` is not satisfied
   --> $DIR/imm-ref-trait-object-literal.rs:13:7
    |
 LL |   foo(s);
-   |   --- ^
-   |   |   |
-   |   |   expected an implementor of trait `Trait`
-   |   |   help: consider mutably borrowing here: `&mut s`
+   |   --- ^ expected an implementor of trait `Trait`
+   |   |
    |   required by a bound introduced by this call
    |
 note: required by a bound in `foo`
@@ -33,6 +31,10 @@ note: required by a bound in `foo`
    |
 LL | fn foo<X: Trait>(_: X) {}
    |           ^^^^^ required by this bound in `foo`
+help: consider mutably borrowing here
+   |
+LL |   foo(&mut s);
+   |       ++++
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/suggestions/issue-84973-2.stderr b/src/test/ui/suggestions/issue-84973-2.stderr
index c1a7a2e101d..2c54ea67245 100644
--- a/src/test/ui/suggestions/issue-84973-2.stderr
+++ b/src/test/ui/suggestions/issue-84973-2.stderr
@@ -2,10 +2,8 @@ error[E0277]: the trait bound `i32: Tr` is not satisfied
   --> $DIR/issue-84973-2.rs:11:9
    |
 LL |     foo(a);
-   |     --- ^
-   |     |   |
-   |     |   expected an implementor of trait `Tr`
-   |     |   help: consider mutably borrowing here: `&mut a`
+   |     --- ^ expected an implementor of trait `Tr`
+   |     |
    |     required by a bound introduced by this call
    |
 note: required by a bound in `foo`
@@ -13,6 +11,10 @@ note: required by a bound in `foo`
    |
 LL | fn foo<T: Tr>(i: T) {}
    |           ^^ required by this bound in `foo`
+help: consider mutably borrowing here
+   |
+LL |     foo(&mut a);
+   |         ++++
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/suggestions/issue-84973-negative.stderr b/src/test/ui/suggestions/issue-84973-negative.stderr
index 14b32d8515c..1f33374eb29 100644
--- a/src/test/ui/suggestions/issue-84973-negative.stderr
+++ b/src/test/ui/suggestions/issue-84973-negative.stderr
@@ -16,10 +16,8 @@ error[E0277]: the trait bound `f32: Tr` is not satisfied
   --> $DIR/issue-84973-negative.rs:11:9
    |
 LL |     bar(b);
-   |     --- ^
-   |     |   |
-   |     |   expected an implementor of trait `Tr`
-   |     |   help: consider borrowing here: `&b`
+   |     --- ^ expected an implementor of trait `Tr`
+   |     |
    |     required by a bound introduced by this call
    |
 note: required by a bound in `bar`
@@ -27,6 +25,10 @@ note: required by a bound in `bar`
    |
 LL | fn bar<T: Tr>(t: T) {}
    |           ^^ required by this bound in `bar`
+help: consider borrowing here
+   |
+LL |     bar(&b);
+   |         +
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/suggestions/issue-84973.stderr b/src/test/ui/suggestions/issue-84973.stderr
index 169d0cccb43..16a28c73aa7 100644
--- a/src/test/ui/suggestions/issue-84973.stderr
+++ b/src/test/ui/suggestions/issue-84973.stderr
@@ -2,10 +2,8 @@ error[E0277]: the trait bound `Fancy: SomeTrait` is not satisfied
   --> $DIR/issue-84973.rs:6:24
    |
 LL |     let o = Other::new(f);
-   |             ---------- ^
-   |             |          |
-   |             |          expected an implementor of trait `SomeTrait`
-   |             |          help: consider borrowing here: `&f`
+   |             ---------- ^ expected an implementor of trait `SomeTrait`
+   |             |
    |             required by a bound introduced by this call
    |
 note: required by `Other::<'a, G>::new`
@@ -13,6 +11,10 @@ note: required by `Other::<'a, G>::new`
    |
 LL |     pub fn new(g: G) -> Self {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^
+help: consider borrowing here
+   |
+LL |     let o = Other::new(&f);
+   |                        +
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/suggestions/slice-issue-87994.stderr b/src/test/ui/suggestions/slice-issue-87994.stderr
index 5d4923b8676..0275fd475d8 100644
--- a/src/test/ui/suggestions/slice-issue-87994.stderr
+++ b/src/test/ui/suggestions/slice-issue-87994.stderr
@@ -14,9 +14,9 @@ LL |     fn into_iter(self) -> Self::IntoIter;
 help: consider borrowing here
    |
 LL |   for _ in &v[1..] {
-   |            ~~~~~~~
+   |            +
 LL |   for _ in &mut v[1..] {
-   |            ~~~~~~~~~~~
+   |            ++++
 
 error[E0277]: `[i32]` is not an iterator
   --> $DIR/slice-issue-87994.rs:3:12
@@ -34,9 +34,9 @@ LL |     fn into_iter(self) -> Self::IntoIter;
 help: consider borrowing here
    |
 LL |   for _ in &v[1..] {
-   |            ~~~~~~~
+   |            +
 LL |   for _ in &mut v[1..] {
-   |            ~~~~~~~~~~~
+   |            ++++
 
 error[E0277]: the size for values of type `[K]` cannot be known at compilation time
   --> $DIR/slice-issue-87994.rs:11:13
@@ -54,9 +54,9 @@ LL |     fn into_iter(self) -> Self::IntoIter;
 help: consider borrowing here
    |
 LL |   for i2 in &v2[1..] {
-   |             ~~~~~~~~
+   |             +
 LL |   for i2 in &mut v2[1..] {
-   |             ~~~~~~~~~~~~
+   |             ++++
 
 error[E0277]: `[K]` is not an iterator
   --> $DIR/slice-issue-87994.rs:11:13
@@ -74,9 +74,9 @@ LL |     fn into_iter(self) -> Self::IntoIter;
 help: consider borrowing here
    |
 LL |   for i2 in &v2[1..] {
-   |             ~~~~~~~~
+   |             +
 LL |   for i2 in &mut v2[1..] {
-   |             ~~~~~~~~~~~~
+   |             ++++
 
 error: aborting due to 4 previous errors
 
diff --git a/src/test/ui/suggestions/suggest-both-imm-and-mut-trait-implementation.stderr b/src/test/ui/suggestions/suggest-both-imm-and-mut-trait-implementation.stderr
index 420f5e65cad..d31c1e6ccee 100644
--- a/src/test/ui/suggestions/suggest-both-imm-and-mut-trait-implementation.stderr
+++ b/src/test/ui/suggestions/suggest-both-imm-and-mut-trait-implementation.stderr
@@ -14,9 +14,9 @@ LL | fn foo<X: Trait>(_: X) {}
 help: consider borrowing here
    |
 LL |     foo(&s);
-   |         ~~
+   |         +
 LL |     foo(&mut s);
-   |         ~~~~~~
+   |         ++++
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/traits/negative-impls/negated-auto-traits-error.stderr b/src/test/ui/traits/negative-impls/negated-auto-traits-error.stderr
index ef6a30a2483..8059a8ca71e 100644
--- a/src/test/ui/traits/negative-impls/negated-auto-traits-error.stderr
+++ b/src/test/ui/traits/negative-impls/negated-auto-traits-error.stderr
@@ -61,10 +61,8 @@ error[E0277]: `dummy2::TestType` cannot be sent between threads safely
   --> $DIR/negated-auto-traits-error.rs:48:13
    |
 LL |     is_send(Box::new(TestType));
-   |     ------- ^^^^^^^^^^^^^^^^^^
-   |     |       |
-   |     |       expected an implementor of trait `Send`
-   |     |       help: consider borrowing here: `&Box::new(TestType)`
+   |     ------- ^^^^^^^^^^^^^^^^^^ expected an implementor of trait `Send`
+   |     |
    |     required by a bound introduced by this call
    |
    = note: the trait bound `dummy2::TestType: Send` is not satisfied
@@ -75,6 +73,10 @@ note: required by a bound in `is_send`
    |
 LL | fn is_send<T: Send>(_: T) {}
    |               ^^^^ required by this bound in `is_send`
+help: consider borrowing here
+   |
+LL |     is_send(&Box::new(TestType));
+   |             +
 
 error[E0277]: `dummy3::TestType` cannot be sent between threads safely
   --> $DIR/negated-auto-traits-error.rs:56:13
@@ -120,9 +122,9 @@ LL | fn is_sync<T: Sync>(_: T) {}
 help: consider borrowing here
    |
 LL |     is_sync(&Outer2(TestType));
-   |             ~~~~~~~~~~~~~~~~~
+   |             +
 LL |     is_sync(&mut Outer2(TestType));
-   |             ~~~~~~~~~~~~~~~~~~~~~
+   |             ++++
 
 error: aborting due to 7 previous errors