about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-11-30 16:11:52 +0100
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-11-30 16:33:27 +0100
commit9e062c85bb0a905bdba4d4e962abe389c46bb86d (patch)
treed273a1f918c61a7b71d6c76870ef31d52d0a7f23
parent12697fa998cb3def57275254df78825def0c01b8 (diff)
downloadrust-9e062c85bb0a905bdba4d4e962abe389c46bb86d.tar.gz
rust-9e062c85bb0a905bdba4d4e962abe389c46bb86d.zip
Report a targeted note for generic parameters
-rw-r--r--src/librustc_typeck/check/op.rs5
-rw-r--r--src/test/ui/type-check/missing_trait_impl.rs17
-rw-r--r--src/test/ui/type-check/missing_trait_impl.stderr10
3 files changed, 32 insertions, 0 deletions
diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs
index 2d45f797ecb..e099d1c0c25 100644
--- a/src/librustc_typeck/check/op.rs
+++ b/src/librustc_typeck/check/op.rs
@@ -289,6 +289,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                                 // This has nothing here because it means we did string
                                 // concatenation (e.g. "Hello " + "World!"). This means
                                 // we don't want the note in the else clause to be emitted
+                            } else if let ty::TyParam(_) = lhs_ty.sty {
+                                // FIXME: point to span of param
+                                err.note(
+                                    &format!("`{}` might need a bound for `{}`",
+                                             lhs_ty, missing_trait));
                             } else {
                                 err.note(
                                     &format!("an implementation of `{}` might be missing for `{}`",
diff --git a/src/test/ui/type-check/missing_trait_impl.rs b/src/test/ui/type-check/missing_trait_impl.rs
new file mode 100644
index 00000000000..fe008db68a0
--- /dev/null
+++ b/src/test/ui/type-check/missing_trait_impl.rs
@@ -0,0 +1,17 @@
+// Copyright 2017 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.
+
+fn main() {
+}
+
+fn foo<T>(x: T, y: T) {
+    let z = x + y; //~ ERROR binary operation `+` cannot be applied to type `T`
+    //~^ NOTE `T` might need a bound for `std::ops::Add`
+}
diff --git a/src/test/ui/type-check/missing_trait_impl.stderr b/src/test/ui/type-check/missing_trait_impl.stderr
new file mode 100644
index 00000000000..64f8167eb1d
--- /dev/null
+++ b/src/test/ui/type-check/missing_trait_impl.stderr
@@ -0,0 +1,10 @@
+error[E0369]: binary operation `+` cannot be applied to type `T`
+  --> $DIR/missing_trait_impl.rs:15:13
+   |
+15 |     let z = x + y; //~ ERROR binary operation `+` cannot be applied to type `T`
+   |             ^^^^^
+   |
+   = note: `T` might need a bound for `std::ops::Add`
+
+error: aborting due to previous error
+