about summary refs log tree commit diff
diff options
context:
space:
mode:
authorhgallagher1993 <hgallagher1993@gmail.com>2019-03-27 13:13:09 -0400
committerhgallagher1993 <hgallagher1993@gmail.com>2019-03-27 13:13:09 -0400
commit4d648ce1b936de167260ed4d11f8c3d2f6462ff0 (patch)
tree82dc159bcfc5ec0a32ffc378147df04cf3a7927f
parentc5fb4d0d2f464bc9ab61f7693ed4dde4d9326820 (diff)
downloadrust-4d648ce1b936de167260ed4d11f8c3d2f6462ff0.tar.gz
rust-4d648ce1b936de167260ed4d11f8c3d2f6462ff0.zip
Better diagnostic for binary operation on BoxedValues
-rw-r--r--src/librustc_typeck/check/op.rs6
-rw-r--r--src/test/ui/autoderef-full-lval.stderr12
-rw-r--r--src/test/ui/binary-op-on-double-ref.stderr6
-rw-r--r--src/test/ui/binop/binop-bitxor-str.stderr6
-rw-r--r--src/test/ui/binop/binop-mul-bool.stderr6
-rw-r--r--src/test/ui/binop/binop-typeck.stderr6
-rw-r--r--src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr6
-rw-r--r--src/test/ui/derives/derives-span-PartialEq-enum.stderr6
-rw-r--r--src/test/ui/derives/derives-span-PartialEq-struct.stderr6
-rw-r--r--src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr6
-rw-r--r--src/test/ui/derives/deriving-no-inner-impl-error-message.stderr6
-rw-r--r--src/test/ui/fn/fn-compare-mismatch.stderr6
-rw-r--r--src/test/ui/for/for-loop-type-error.stderr6
-rw-r--r--src/test/ui/issues/issue-14915.stderr6
-rw-r--r--src/test/ui/issues/issue-24363.stderr6
-rw-r--r--src/test/ui/issues/issue-28837.stderr90
-rw-r--r--src/test/ui/issues/issue-31076.stderr12
-rw-r--r--src/test/ui/issues/issue-35668.stderr6
-rw-r--r--src/test/ui/issues/issue-3820.stderr6
-rw-r--r--src/test/ui/issues/issue-40610.stderr6
-rw-r--r--src/test/ui/issues/issue-41394.stderr6
-rw-r--r--src/test/ui/issues/issue-47377.stderr8
-rw-r--r--src/test/ui/issues/issue-47380.stderr8
-rw-r--r--src/test/ui/parser/require-parens-for-chained-comparison.stderr6
-rw-r--r--src/test/ui/pattern/pattern-tyvar-2.stderr6
-rw-r--r--src/test/ui/span/issue-39018.stderr22
-rw-r--r--src/test/ui/str/str-concat-on-double-ref.stderr6
-rw-r--r--src/test/ui/traits/trait-resolution-in-overloaded-op.stderr6
-rw-r--r--src/test/ui/type/type-check/missing_trait_impl.stderr6
-rw-r--r--src/test/ui/vec/vec-res-add.stderr6
30 files changed, 211 insertions, 85 deletions
diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs
index 9d883b22214..f8212659f02 100644
--- a/src/librustc_typeck/check/op.rs
+++ b/src/librustc_typeck/check/op.rs
@@ -327,10 +327,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                             err.emit();
                         }
                         IsAssign::No => {
-                            let mut err = struct_span_err!(self.tcx.sess, expr.span, E0369,
+                            let mut err = struct_span_err!(self.tcx.sess, op.span, E0369,
                                 "binary operation `{}` cannot be applied to type `{}`",
                                 op.node.as_str(),
                                 lhs_ty);
+
+                            err.span_label(lhs_expr.span, lhs_ty.to_string());
+                            err.span_label(rhs_expr.span, rhs_ty.to_string());
+
                             let mut suggested_deref = false;
                             if let Ref(_, mut rty, _) = lhs_ty.sty {
                                 if {
diff --git a/src/test/ui/autoderef-full-lval.stderr b/src/test/ui/autoderef-full-lval.stderr
index b92259b69df..c9f3e8b2e26 100644
--- a/src/test/ui/autoderef-full-lval.stderr
+++ b/src/test/ui/autoderef-full-lval.stderr
@@ -1,16 +1,20 @@
 error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>`
-  --> $DIR/autoderef-full-lval.rs:15:20
+  --> $DIR/autoderef-full-lval.rs:15:24
    |
 LL |     let z: isize = a.x + b.y;
-   |                    ^^^^^^^^^
+   |                    --- ^ --- std::boxed::Box<isize>
+   |                    |
+   |                    std::boxed::Box<isize>
    |
    = note: an implementation of `std::ops::Add` might be missing for `std::boxed::Box<isize>`
 
 error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>`
-  --> $DIR/autoderef-full-lval.rs:21:25
+  --> $DIR/autoderef-full-lval.rs:21:33
    |
 LL |     let answer: isize = forty.a + two.a;
-   |                         ^^^^^^^^^^^^^^^
+   |                         ------- ^ ----- std::boxed::Box<isize>
+   |                         |
+   |                         std::boxed::Box<isize>
    |
    = note: an implementation of `std::ops::Add` might be missing for `std::boxed::Box<isize>`
 
diff --git a/src/test/ui/binary-op-on-double-ref.stderr b/src/test/ui/binary-op-on-double-ref.stderr
index f298902e3ff..d036f06a8c7 100644
--- a/src/test/ui/binary-op-on-double-ref.stderr
+++ b/src/test/ui/binary-op-on-double-ref.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `%` cannot be applied to type `&&{integer}`
-  --> $DIR/binary-op-on-double-ref.rs:4:9
+  --> $DIR/binary-op-on-double-ref.rs:4:11
    |
 LL |         x % 2 == 0
-   |         ^^^^^
+   |         - ^ - {integer}
+   |         |
+   |         &&{integer}
    |
    = help: `%` can be used on '{integer}', you can dereference `x`: `*x`
 
diff --git a/src/test/ui/binop/binop-bitxor-str.stderr b/src/test/ui/binop/binop-bitxor-str.stderr
index 4404fde9200..9e8992235ed 100644
--- a/src/test/ui/binop/binop-bitxor-str.stderr
+++ b/src/test/ui/binop/binop-bitxor-str.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `^` cannot be applied to type `std::string::String`
-  --> $DIR/binop-bitxor-str.rs:3:21
+  --> $DIR/binop-bitxor-str.rs:3:37
    |
 LL | fn main() { let x = "a".to_string() ^ "b".to_string(); }
-   |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                     --------------- ^ --------------- std::string::String
+   |                     |
+   |                     std::string::String
    |
    = note: an implementation of `std::ops::BitXor` might be missing for `std::string::String`
 
diff --git a/src/test/ui/binop/binop-mul-bool.stderr b/src/test/ui/binop/binop-mul-bool.stderr
index 194181b9c11..92e14bccccd 100644
--- a/src/test/ui/binop/binop-mul-bool.stderr
+++ b/src/test/ui/binop/binop-mul-bool.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `*` cannot be applied to type `bool`
-  --> $DIR/binop-mul-bool.rs:3:21
+  --> $DIR/binop-mul-bool.rs:3:26
    |
 LL | fn main() { let x = true * false; }
-   |                     ^^^^^^^^^^^^
+   |                     ---- ^ ----- bool
+   |                     |
+   |                     bool
    |
    = note: an implementation of `std::ops::Mul` might be missing for `bool`
 
diff --git a/src/test/ui/binop/binop-typeck.stderr b/src/test/ui/binop/binop-typeck.stderr
index 928e836c0b5..d33cff313e7 100644
--- a/src/test/ui/binop/binop-typeck.stderr
+++ b/src/test/ui/binop/binop-typeck.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `bool`
-  --> $DIR/binop-typeck.rs:6:13
+  --> $DIR/binop-typeck.rs:6:15
    |
 LL |     let z = x + y;
-   |             ^^^^^
+   |             - ^ - {integer}
+   |             |
+   |             bool
    |
    = note: an implementation of `std::ops::Add` might be missing for `bool`
 
diff --git a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr
index ed5468cc4da..673f23d29eb 100644
--- a/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr
+++ b/src/test/ui/derives/derives-span-PartialEq-enum-struct-variant.stderr
@@ -3,6 +3,9 @@ error[E0369]: binary operation `==` cannot be applied to type `Error`
    |
 LL |      x: Error
    |      ^^^^^^^^
+   |      |
+   |      Error
+   |      Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
@@ -11,6 +14,9 @@ error[E0369]: binary operation `!=` cannot be applied to type `Error`
    |
 LL |      x: Error
    |      ^^^^^^^^
+   |      |
+   |      Error
+   |      Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
diff --git a/src/test/ui/derives/derives-span-PartialEq-enum.stderr b/src/test/ui/derives/derives-span-PartialEq-enum.stderr
index 06a88c03f58..6ab18b45b73 100644
--- a/src/test/ui/derives/derives-span-PartialEq-enum.stderr
+++ b/src/test/ui/derives/derives-span-PartialEq-enum.stderr
@@ -3,6 +3,9 @@ error[E0369]: binary operation `==` cannot be applied to type `Error`
    |
 LL |      Error
    |      ^^^^^
+   |      |
+   |      Error
+   |      Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
@@ -11,6 +14,9 @@ error[E0369]: binary operation `!=` cannot be applied to type `Error`
    |
 LL |      Error
    |      ^^^^^
+   |      |
+   |      Error
+   |      Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
diff --git a/src/test/ui/derives/derives-span-PartialEq-struct.stderr b/src/test/ui/derives/derives-span-PartialEq-struct.stderr
index b8481048361..bdd12942b47 100644
--- a/src/test/ui/derives/derives-span-PartialEq-struct.stderr
+++ b/src/test/ui/derives/derives-span-PartialEq-struct.stderr
@@ -3,6 +3,9 @@ error[E0369]: binary operation `==` cannot be applied to type `Error`
    |
 LL |     x: Error
    |     ^^^^^^^^
+   |     |
+   |     Error
+   |     Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
@@ -11,6 +14,9 @@ error[E0369]: binary operation `!=` cannot be applied to type `Error`
    |
 LL |     x: Error
    |     ^^^^^^^^
+   |     |
+   |     Error
+   |     Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
diff --git a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr
index 4398d252125..9f60b2ea816 100644
--- a/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr
+++ b/src/test/ui/derives/derives-span-PartialEq-tuple-struct.stderr
@@ -3,6 +3,9 @@ error[E0369]: binary operation `==` cannot be applied to type `Error`
    |
 LL |     Error
    |     ^^^^^
+   |     |
+   |     Error
+   |     Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
@@ -11,6 +14,9 @@ error[E0369]: binary operation `!=` cannot be applied to type `Error`
    |
 LL |     Error
    |     ^^^^^
+   |     |
+   |     Error
+   |     Error
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `Error`
 
diff --git a/src/test/ui/derives/deriving-no-inner-impl-error-message.stderr b/src/test/ui/derives/deriving-no-inner-impl-error-message.stderr
index 3206eecbe30..4baf27c520c 100644
--- a/src/test/ui/derives/deriving-no-inner-impl-error-message.stderr
+++ b/src/test/ui/derives/deriving-no-inner-impl-error-message.stderr
@@ -3,6 +3,9 @@ error[E0369]: binary operation `==` cannot be applied to type `NoCloneOrEq`
    |
 LL |     x: NoCloneOrEq
    |     ^^^^^^^^^^^^^^
+   |     |
+   |     NoCloneOrEq
+   |     NoCloneOrEq
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `NoCloneOrEq`
 
@@ -11,6 +14,9 @@ error[E0369]: binary operation `!=` cannot be applied to type `NoCloneOrEq`
    |
 LL |     x: NoCloneOrEq
    |     ^^^^^^^^^^^^^^
+   |     |
+   |     NoCloneOrEq
+   |     NoCloneOrEq
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `NoCloneOrEq`
 
diff --git a/src/test/ui/fn/fn-compare-mismatch.stderr b/src/test/ui/fn/fn-compare-mismatch.stderr
index 54dae525ffd..07b93d9aae7 100644
--- a/src/test/ui/fn/fn-compare-mismatch.stderr
+++ b/src/test/ui/fn/fn-compare-mismatch.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `==` cannot be applied to type `fn() {main::f}`
-  --> $DIR/fn-compare-mismatch.rs:4:13
+  --> $DIR/fn-compare-mismatch.rs:4:15
    |
 LL |     let x = f == g;
-   |             ^^^^^^
+   |             - ^^ - fn() {main::g}
+   |             |
+   |             fn() {main::f}
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `fn() {main::f}`
 
diff --git a/src/test/ui/for/for-loop-type-error.stderr b/src/test/ui/for/for-loop-type-error.stderr
index f1c1d0a5388..588e7a0ed33 100644
--- a/src/test/ui/for/for-loop-type-error.stderr
+++ b/src/test/ui/for/for-loop-type-error.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `()`
-  --> $DIR/for-loop-type-error.rs:2:13
+  --> $DIR/for-loop-type-error.rs:2:16
    |
 LL |     let x = () + ();
-   |             ^^^^^^^
+   |             -- ^ -- ()
+   |             |
+   |             ()
    |
    = note: an implementation of `std::ops::Add` might be missing for `()`
 
diff --git a/src/test/ui/issues/issue-14915.stderr b/src/test/ui/issues/issue-14915.stderr
index 411d7a34552..e8de44320da 100644
--- a/src/test/ui/issues/issue-14915.stderr
+++ b/src/test/ui/issues/issue-14915.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `std::boxed::Box<isize>`
-  --> $DIR/issue-14915.rs:6:20
+  --> $DIR/issue-14915.rs:6:22
    |
 LL |     println!("{}", x + 1);
-   |                    ^^^^^
+   |                    - ^ - {integer}
+   |                    |
+   |                    std::boxed::Box<isize>
    |
    = note: an implementation of `std::ops::Add` might be missing for `std::boxed::Box<isize>`
 
diff --git a/src/test/ui/issues/issue-24363.stderr b/src/test/ui/issues/issue-24363.stderr
index 3399856d3f9..6f269ba764c 100644
--- a/src/test/ui/issues/issue-24363.stderr
+++ b/src/test/ui/issues/issue-24363.stderr
@@ -5,10 +5,12 @@ LL |     1.create_a_type_error[
    |       ^^^^^^^^^^^^^^^^^^^
 
 error[E0369]: binary operation `+` cannot be applied to type `()`
-  --> $DIR/issue-24363.rs:3:9
+  --> $DIR/issue-24363.rs:3:11
    |
 LL |         ()+()
-   |         ^^^^^
+   |         --^-- ()
+   |         |
+   |         ()
    |
    = note: an implementation of `std::ops::Add` might be missing for `()`
 
diff --git a/src/test/ui/issues/issue-28837.stderr b/src/test/ui/issues/issue-28837.stderr
index aeb25ce1286..ac2a9f2203d 100644
--- a/src/test/ui/issues/issue-28837.stderr
+++ b/src/test/ui/issues/issue-28837.stderr
@@ -1,120 +1,150 @@
 error[E0369]: binary operation `+` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:6:5
+  --> $DIR/issue-28837.rs:6:7
    |
 LL |     a + a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Add` might be missing for `A`
 
 error[E0369]: binary operation `-` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:8:5
+  --> $DIR/issue-28837.rs:8:7
    |
 LL |     a - a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Sub` might be missing for `A`
 
 error[E0369]: binary operation `*` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:10:5
+  --> $DIR/issue-28837.rs:10:7
    |
 LL |     a * a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Mul` might be missing for `A`
 
 error[E0369]: binary operation `/` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:12:5
+  --> $DIR/issue-28837.rs:12:7
    |
 LL |     a / a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Div` might be missing for `A`
 
 error[E0369]: binary operation `%` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:14:5
+  --> $DIR/issue-28837.rs:14:7
    |
 LL |     a % a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Rem` might be missing for `A`
 
 error[E0369]: binary operation `&` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:16:5
+  --> $DIR/issue-28837.rs:16:7
    |
 LL |     a & a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::BitAnd` might be missing for `A`
 
 error[E0369]: binary operation `|` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:18:5
+  --> $DIR/issue-28837.rs:18:7
    |
 LL |     a | a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::BitOr` might be missing for `A`
 
 error[E0369]: binary operation `<<` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:20:5
+  --> $DIR/issue-28837.rs:20:7
    |
 LL |     a << a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Shl` might be missing for `A`
 
 error[E0369]: binary operation `>>` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:22:5
+  --> $DIR/issue-28837.rs:22:7
    |
 LL |     a >> a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::ops::Shr` might be missing for `A`
 
 error[E0369]: binary operation `==` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:24:5
+  --> $DIR/issue-28837.rs:24:7
    |
 LL |     a == a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `A`
 
 error[E0369]: binary operation `!=` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:26:5
+  --> $DIR/issue-28837.rs:26:7
    |
 LL |     a != a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialEq` might be missing for `A`
 
 error[E0369]: binary operation `<` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:28:5
+  --> $DIR/issue-28837.rs:28:7
    |
 LL |     a < a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialOrd` might be missing for `A`
 
 error[E0369]: binary operation `<=` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:30:5
+  --> $DIR/issue-28837.rs:30:7
    |
 LL |     a <= a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialOrd` might be missing for `A`
 
 error[E0369]: binary operation `>` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:32:5
+  --> $DIR/issue-28837.rs:32:7
    |
 LL |     a > a;
-   |     ^^^^^
+   |     - ^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialOrd` might be missing for `A`
 
 error[E0369]: binary operation `>=` cannot be applied to type `A`
-  --> $DIR/issue-28837.rs:34:5
+  --> $DIR/issue-28837.rs:34:7
    |
 LL |     a >= a;
-   |     ^^^^^^
+   |     - ^^ - A
+   |     |
+   |     A
    |
    = note: an implementation of `std::cmp::PartialOrd` might be missing for `A`
 
diff --git a/src/test/ui/issues/issue-31076.stderr b/src/test/ui/issues/issue-31076.stderr
index 3a13f02d9f4..60a3be1c36b 100644
--- a/src/test/ui/issues/issue-31076.stderr
+++ b/src/test/ui/issues/issue-31076.stderr
@@ -1,16 +1,20 @@
 error[E0369]: binary operation `+` cannot be applied to type `{integer}`
-  --> $DIR/issue-31076.rs:13:13
+  --> $DIR/issue-31076.rs:13:15
    |
 LL |     let x = 5 + 6;
-   |             ^^^^^
+   |             - ^ - {integer}
+   |             |
+   |             {integer}
    |
    = note: an implementation of `std::ops::Add` might be missing for `{integer}`
 
 error[E0369]: binary operation `+` cannot be applied to type `i32`
-  --> $DIR/issue-31076.rs:15:13
+  --> $DIR/issue-31076.rs:15:18
    |
 LL |     let y = 5i32 + 6i32;
-   |             ^^^^^^^^^^^
+   |             ---- ^ ---- i32
+   |             |
+   |             i32
    |
    = note: an implementation of `std::ops::Add` might be missing for `i32`
 
diff --git a/src/test/ui/issues/issue-35668.stderr b/src/test/ui/issues/issue-35668.stderr
index 08ce2faff10..59ca874bd20 100644
--- a/src/test/ui/issues/issue-35668.stderr
+++ b/src/test/ui/issues/issue-35668.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `*` cannot be applied to type `&T`
-  --> $DIR/issue-35668.rs:2:22
+  --> $DIR/issue-35668.rs:2:23
    |
 LL |     a.iter().map(|a| a*a)
-   |                      ^^^
+   |                      -^- &T
+   |                      |
+   |                      &T
    |
    = note: an implementation of `std::ops::Mul` might be missing for `&T`
 
diff --git a/src/test/ui/issues/issue-3820.stderr b/src/test/ui/issues/issue-3820.stderr
index b4af9c2d27d..35eceb3b3c6 100644
--- a/src/test/ui/issues/issue-3820.stderr
+++ b/src/test/ui/issues/issue-3820.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `*` cannot be applied to type `Thing`
-  --> $DIR/issue-3820.rs:14:13
+  --> $DIR/issue-3820.rs:14:15
    |
 LL |     let w = u * 3;
-   |             ^^^^^
+   |             - ^ - {integer}
+   |             |
+   |             Thing
    |
    = note: an implementation of `std::ops::Mul` might be missing for `Thing`
 
diff --git a/src/test/ui/issues/issue-40610.stderr b/src/test/ui/issues/issue-40610.stderr
index f441d65b91e..9d577591929 100644
--- a/src/test/ui/issues/issue-40610.stderr
+++ b/src/test/ui/issues/issue-40610.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `()`
-  --> $DIR/issue-40610.rs:4:5
+  --> $DIR/issue-40610.rs:4:8
    |
 LL |     () + f(&[1.0]);
-   |     ^^^^^^^^^^^^^^
+   |     -- ^ --------- ()
+   |     |
+   |     ()
    |
    = note: an implementation of `std::ops::Add` might be missing for `()`
 
diff --git a/src/test/ui/issues/issue-41394.stderr b/src/test/ui/issues/issue-41394.stderr
index bc5c6e798e8..5de5889d817 100644
--- a/src/test/ui/issues/issue-41394.stderr
+++ b/src/test/ui/issues/issue-41394.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `&str`
-  --> $DIR/issue-41394.rs:2:9
+  --> $DIR/issue-41394.rs:2:12
    |
 LL |     A = "" + 1
-   |         ^^^^^^
+   |         -- ^ - {integer}
+   |         |
+   |         &str
    |
    = note: an implementation of `std::ops::Add` might be missing for `&str`
 
diff --git a/src/test/ui/issues/issue-47377.stderr b/src/test/ui/issues/issue-47377.stderr
index 1e945727746..f782ad42fcb 100644
--- a/src/test/ui/issues/issue-47377.stderr
+++ b/src/test/ui/issues/issue-47377.stderr
@@ -1,8 +1,12 @@
 error[E0369]: binary operation `+` cannot be applied to type `&str`
-  --> $DIR/issue-47377.rs:4:12
+  --> $DIR/issue-47377.rs:4:14
    |
 LL |      let _a = b + ", World!";
-   |               ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings
+   |               --^-----------
+   |               |   |
+   |               |   &str
+   |               &str
+   |               `+` can't be used to concatenate two `&str` strings
 help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left
    |
 LL |      let _a = b.to_owned() + ", World!";
diff --git a/src/test/ui/issues/issue-47380.stderr b/src/test/ui/issues/issue-47380.stderr
index 84c5df3ca89..753892c97e7 100644
--- a/src/test/ui/issues/issue-47380.stderr
+++ b/src/test/ui/issues/issue-47380.stderr
@@ -1,8 +1,12 @@
 error[E0369]: binary operation `+` cannot be applied to type `&str`
-  --> $DIR/issue-47380.rs:3:33
+  --> $DIR/issue-47380.rs:3:35
    |
 LL |     println!("🦀🦀🦀🦀🦀"); let _a = b + ", World!";
-   |                                      ^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings
+   |                                      --^-----------
+   |                                      |   |
+   |                                      |   &str
+   |                                      &str
+   |                                      `+` can't be used to concatenate two `&str` strings
 help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left
    |
 LL |     println!("🦀🦀🦀🦀🦀"); let _a = b.to_owned() + ", World!";
diff --git a/src/test/ui/parser/require-parens-for-chained-comparison.stderr b/src/test/ui/parser/require-parens-for-chained-comparison.stderr
index 4597b143215..8899b0d43cd 100644
--- a/src/test/ui/parser/require-parens-for-chained-comparison.stderr
+++ b/src/test/ui/parser/require-parens-for-chained-comparison.stderr
@@ -38,10 +38,12 @@ LL |     false == 0 < 2;
               found type `{integer}`
 
 error[E0369]: binary operation `<` cannot be applied to type `fn() {f::<_>}`
-  --> $DIR/require-parens-for-chained-comparison.rs:13:5
+  --> $DIR/require-parens-for-chained-comparison.rs:13:6
    |
 LL |     f<X>();
-   |     ^^^
+   |     -^- X
+   |     |
+   |     fn() {f::<_>}
    |
    = note: an implementation of `std::cmp::PartialOrd` might be missing for `fn() {f::<_>}`
 
diff --git a/src/test/ui/pattern/pattern-tyvar-2.stderr b/src/test/ui/pattern/pattern-tyvar-2.stderr
index 5218dd916a5..7c6ae499cbb 100644
--- a/src/test/ui/pattern/pattern-tyvar-2.stderr
+++ b/src/test/ui/pattern/pattern-tyvar-2.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `*` cannot be applied to type `std::vec::Vec<isize>`
-  --> $DIR/pattern-tyvar-2.rs:3:69
+  --> $DIR/pattern-tyvar-2.rs:3:71
    |
 LL | fn foo(t: Bar) -> isize { match t { Bar::T1(_, Some(x)) => { return x * 3; } _ => { panic!(); } } }
-   |                                                                     ^^^^^
+   |                                                                     - ^ - {integer}
+   |                                                                     |
+   |                                                                     std::vec::Vec<isize>
    |
    = note: an implementation of `std::ops::Mul` might be missing for `std::vec::Vec<isize>`
 
diff --git a/src/test/ui/span/issue-39018.stderr b/src/test/ui/span/issue-39018.stderr
index 00f1b11df19..6e475483987 100644
--- a/src/test/ui/span/issue-39018.stderr
+++ b/src/test/ui/span/issue-39018.stderr
@@ -1,26 +1,36 @@
 error[E0369]: binary operation `+` cannot be applied to type `&str`
-  --> $DIR/issue-39018.rs:2:13
+  --> $DIR/issue-39018.rs:2:22
    |
 LL |     let x = "Hello " + "World!";
-   |             ^^^^^^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings
+   |             ---------^---------
+   |             |          |
+   |             |          &str
+   |             &str
+   |             `+` can't be used to concatenate two `&str` strings
 help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left
    |
 LL |     let x = "Hello ".to_owned() + "World!";
    |             ^^^^^^^^^^^^^^^^^^^
 
 error[E0369]: binary operation `+` cannot be applied to type `World`
-  --> $DIR/issue-39018.rs:8:13
+  --> $DIR/issue-39018.rs:8:26
    |
 LL |     let y = World::Hello + World::Goodbye;
-   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |             ------------ ^ -------------- World
+   |             |
+   |             World
    |
    = note: an implementation of `std::ops::Add` might be missing for `World`
 
 error[E0369]: binary operation `+` cannot be applied to type `&str`
-  --> $DIR/issue-39018.rs:11:13
+  --> $DIR/issue-39018.rs:11:22
    |
 LL |     let x = "Hello " + "World!".to_owned();
-   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `+` can't be used to concatenate a `&str` with a `String`
+   |             ---------^--------------------
+   |             |          |
+   |             |          std::string::String
+   |             &str
+   |             `+` can't be used to concatenate a `&str` with a `String`
 help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left
    |
 LL |     let x = "Hello ".to_owned() + &"World!".to_owned();
diff --git a/src/test/ui/str/str-concat-on-double-ref.stderr b/src/test/ui/str/str-concat-on-double-ref.stderr
index a67db1936f0..61ebcfdefc3 100644
--- a/src/test/ui/str/str-concat-on-double-ref.stderr
+++ b/src/test/ui/str/str-concat-on-double-ref.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `&std::string::String`
-  --> $DIR/str-concat-on-double-ref.rs:4:13
+  --> $DIR/str-concat-on-double-ref.rs:4:15
    |
 LL |     let c = a + b;
-   |             ^^^^^
+   |             - ^ - &str
+   |             |
+   |             &std::string::String
    |
    = note: an implementation of `std::ops::Add` might be missing for `&std::string::String`
 
diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr
index 3b10632b818..d11562e2a00 100644
--- a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr
+++ b/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `*` cannot be applied to type `&T`
-  --> $DIR/trait-resolution-in-overloaded-op.rs:8:5
+  --> $DIR/trait-resolution-in-overloaded-op.rs:8:7
    |
 LL |     a * b
-   |     ^^^^^
+   |     - ^ - f64
+   |     |
+   |     &T
    |
    = note: an implementation of `std::ops::Mul` might be missing for `&T`
 
diff --git a/src/test/ui/type/type-check/missing_trait_impl.stderr b/src/test/ui/type/type-check/missing_trait_impl.stderr
index 69b531d0c84..b0e3c35c705 100644
--- a/src/test/ui/type/type-check/missing_trait_impl.stderr
+++ b/src/test/ui/type/type-check/missing_trait_impl.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `T`
-  --> $DIR/missing_trait_impl.rs:5:13
+  --> $DIR/missing_trait_impl.rs:5:15
    |
 LL |     let z = x + y;
-   |             ^^^^^
+   |             - ^ - T
+   |             |
+   |             T
    |
    = note: `T` might need a bound for `std::ops::Add`
 
diff --git a/src/test/ui/vec/vec-res-add.stderr b/src/test/ui/vec/vec-res-add.stderr
index 39552697631..78b70f09e90 100644
--- a/src/test/ui/vec/vec-res-add.stderr
+++ b/src/test/ui/vec/vec-res-add.stderr
@@ -1,8 +1,10 @@
 error[E0369]: binary operation `+` cannot be applied to type `std::vec::Vec<R>`
-  --> $DIR/vec-res-add.rs:16:13
+  --> $DIR/vec-res-add.rs:16:15
    |
 LL |     let k = i + j;
-   |             ^^^^^
+   |             - ^ - std::vec::Vec<R>
+   |             |
+   |             std::vec::Vec<R>
    |
    = note: an implementation of `std::ops::Add` might be missing for `std::vec::Vec<R>`