about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTyler Mandry <tmandry@gmail.com>2018-03-21 13:32:46 -0500
committerTyler Mandry <tmandry@gmail.com>2018-03-21 13:32:46 -0500
commitb6934c91b23517c4e17d8016b6c46ffd0703eded (patch)
tree7a1410a8946ae3da985ed3516a784e99ba5460aa
parent2cdc7af41366182259a05435e325d7444653a3e8 (diff)
downloadrust-b6934c91b23517c4e17d8016b6c46ffd0703eded.tar.gz
rust-b6934c91b23517c4e17d8016b6c46ffd0703eded.zip
termination_trait: Put examples in error help, not label
-rw-r--r--src/librustc/traits/error_reporting.rs23
-rw-r--r--src/libstd/process.rs2
-rw-r--r--src/test/compile-fail/rfc-1937-termination-trait/termination-trait-main-i32.rs2
-rw-r--r--src/test/ui/rfc-1937-termination-trait/termination-trait-main-wrong-type.stderr4
4 files changed, 18 insertions, 13 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index 7e5dc02798d..8572c407714 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -585,20 +585,25 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
                                          trait_ref.to_predicate(), post_message)
                             }));
 
+                        let explanation = match obligation.cause.code {
+                            ObligationCauseCode::MainFunctionType => {
+                                "consider using `()`, or a `Result`".to_owned()
+                            }
+                            _ => {
+                                format!("{}the trait `{}` is not implemented for `{}`",
+                                         pre_message,
+                                         trait_ref,
+                                         trait_ref.self_ty())
+                            }
+                        };
+
                         if let Some(ref s) = label {
                             // If it has a custom "#[rustc_on_unimplemented]"
                             // error message, let's display it as the label!
                             err.span_label(span, s.as_str());
-                            err.help(&format!("{}the trait `{}` is not implemented for `{}`",
-                                              pre_message,
-                                              trait_ref,
-                                              trait_ref.self_ty()));
+                            err.help(&explanation);
                         } else {
-                            err.span_label(span,
-                                           &*format!("{}the trait `{}` is not implemented for `{}`",
-                                                     pre_message,
-                                                     trait_ref,
-                                                     trait_ref.self_ty()));
+                            err.span_label(span, explanation);
                         }
                         if let Some(ref s) = note {
                             // If it has a custom "#[rustc_on_unimplemented]" note, let's display it
diff --git a/src/libstd/process.rs b/src/libstd/process.rs
index a6aa3502f26..d5ac2d19e83 100644
--- a/src/libstd/process.rs
+++ b/src/libstd/process.rs
@@ -1443,7 +1443,7 @@ pub fn id() -> u32 {
 #[cfg_attr(not(test), lang = "termination")]
 #[unstable(feature = "termination_trait_lib", issue = "43301")]
 #[rustc_on_unimplemented =
-  "`main` can only return types like `()` that implement {Termination}, not `{Self}`"]
+  "`main` can only return types that implement {Termination}, not `{Self}`"]
 pub trait Termination {
     /// Is called to get the representation of the value as status code.
     /// This status code is returned to the operating system.
diff --git a/src/test/compile-fail/rfc-1937-termination-trait/termination-trait-main-i32.rs b/src/test/compile-fail/rfc-1937-termination-trait/termination-trait-main-i32.rs
index 053d6bbf93a..2cf9fdcfb4d 100644
--- a/src/test/compile-fail/rfc-1937-termination-trait/termination-trait-main-i32.rs
+++ b/src/test/compile-fail/rfc-1937-termination-trait/termination-trait-main-i32.rs
@@ -10,6 +10,6 @@
 
 fn main() -> i32 {
 //~^ ERROR `i32: std::process::Termination` is not satisfied
-//~| NOTE `main` can only return types like `()` that implement std::process::Termination, not `i32`
+//~| NOTE `main` can only return types that implement std::process::Termination, not `i32`
     0
 }
diff --git a/src/test/ui/rfc-1937-termination-trait/termination-trait-main-wrong-type.stderr b/src/test/ui/rfc-1937-termination-trait/termination-trait-main-wrong-type.stderr
index 24371c27742..211247757cb 100644
--- a/src/test/ui/rfc-1937-termination-trait/termination-trait-main-wrong-type.stderr
+++ b/src/test/ui/rfc-1937-termination-trait/termination-trait-main-wrong-type.stderr
@@ -2,9 +2,9 @@ error[E0277]: the trait bound `char: std::process::Termination` is not satisfied
   --> $DIR/termination-trait-main-wrong-type.rs:11:14
    |
 LL | fn main() -> char { //~ ERROR
-   |              ^^^^ `main` can only return types like `()` that implement std::process::Termination, not `char`
+   |              ^^^^ `main` can only return types that implement std::process::Termination, not `char`
    |
-   = help: the trait `std::process::Termination` is not implemented for `char`
+   = help: consider using `()`, or a `Result`
 
 error: aborting due to previous error