]> git.lizzy.rs Git - rust.git/commitdiff
Report a targeted note for generic parameters
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 30 Nov 2017 15:11:52 +0000 (16:11 +0100)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 30 Nov 2017 15:33:27 +0000 (16:33 +0100)
src/librustc_typeck/check/op.rs
src/test/ui/type-check/missing_trait_impl.rs [new file with mode: 0644]
src/test/ui/type-check/missing_trait_impl.stderr [new file with mode: 0644]

index 2d45f797ecb4d02612d2cfb137c3f197a75e5e29..e099d1c0c2531a46a7a43c809e3a00d682c23090 100644 (file)
@@ -289,6 +289,11 @@ fn check_overloaded_binop(&self,
                                 // 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 (file)
index 0000000..fe008db
--- /dev/null
@@ -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 (file)
index 0000000..64f8167
--- /dev/null
@@ -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
+