diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 0d180e6ad76fda1be666cb41e66e7c0f53bd3083..2878ff5e2846e4f9ad8a776d7758d1a927925e2a 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -1694,6 +1694,30 @@ fn main() { https://doc.rust-lang.org/book/closures.html "##, +E0580: r##" +The `main` function was incorrectly declared. + +Erroneous code example: + +```compile_fail,E0580 +fn main() -> i32 { // error: main function has wrong type + 0 +} +``` + +The `main` function prototype should never take arguments or return type. +Example: + +``` +fn main() { + // your code +} +``` + +If you want to get command-line arguments, use `std::env::args`. To exit with a +specified exit code, use `std::process::exit`. +"##, + } diff --git a/src/librustc/infer/error_reporting.rs b/src/librustc/infer/error_reporting.rs index 095d2a78a94cd993e0b5a0597f07f50006404afc..d859a8b44db0c2af41723e3889427d3042cede3c 100644 --- a/src/librustc/infer/error_reporting.rs +++ b/src/librustc/infer/error_reporting.rs @@ -629,10 +629,13 @@ pub fn report_and_explain_type_error(&self, let mut diag = match trace.cause.code { ObligationCauseCode::IfExpressionWithNoElse => { struct_span_err!(self.tcx.sess, span, E0317, "{}", failure_str) - }, + } + ObligationCauseCode::MainFunctionType => { + struct_span_err!(self.tcx.sess, span, E0580, "{}", failure_str) + } _ => { struct_span_err!(self.tcx.sess, span, E0308, "{}", failure_str) - }, + } }; self.note_type_err(&mut diag, &trace.cause, None, Some(trace.values), terr); diag diff --git a/src/test/compile-fail/E0308-3.rs b/src/test/compile-fail/E0580.rs similarity index 92% rename from src/test/compile-fail/E0308-3.rs rename to src/test/compile-fail/E0580.rs index d7dca056f3fa6ba651766e9a57762b5f84ed0a7d..a2ef7da78a84366ed2a9fcfbbf6ebfdf631909cb 100644 --- a/src/test/compile-fail/E0308-3.rs +++ b/src/test/compile-fail/E0580.rs @@ -8,4 +8,4 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main() -> i32 { 0 } //~ ERROR E0308 +fn main() -> i32 { 0 } //~ ERROR E0580 diff --git a/src/test/compile-fail/bad-main.rs b/src/test/compile-fail/bad-main.rs index 1253f7569e7e8e48ec2f9e315838d05b5c6940fa..b73b4a6af6e89e8fdcd3e29012ab6000c85ac2bb 100644 --- a/src/test/compile-fail/bad-main.rs +++ b/src/test/compile-fail/bad-main.rs @@ -8,4 +8,4 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -fn main(x: isize) { } //~ ERROR: main function has wrong type +fn main(x: isize) { } //~ ERROR: main function has wrong type [E0580] diff --git a/src/test/compile-fail/extern-main-fn.rs b/src/test/compile-fail/extern-main-fn.rs index 11f299acefa874e55b5efa49b81eb345fd9350be..d9bdb4ecd04777a7384fc3b08c274130a5368f57 100644 --- a/src/test/compile-fail/extern-main-fn.rs +++ b/src/test/compile-fail/extern-main-fn.rs @@ -8,4 +8,4 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -extern fn main() {} //~ ERROR: main function has wrong type +extern fn main() {} //~ ERROR: main function has wrong type [E0580] diff --git a/src/test/compile-fail/main-wrong-type-2.rs b/src/test/compile-fail/main-wrong-type-2.rs index 2878cbc7fc15488d6fcfb865390be929d419f7c9..9d74d1a90493bd8c8f08532c63685824df467c5d 100644 --- a/src/test/compile-fail/main-wrong-type-2.rs +++ b/src/test/compile-fail/main-wrong-type-2.rs @@ -9,6 +9,6 @@ // except according to those terms. fn main() -> char { -//~^ ERROR: main function has wrong type +//~^ ERROR: main function has wrong type [E0580] ' ' } diff --git a/src/test/compile-fail/main-wrong-type.rs b/src/test/compile-fail/main-wrong-type.rs index 431b855d5177373cfcabd13a747e6f90dbe86e48..402cd3a2d31b6f2dbeeab22336c924a7361a3d60 100644 --- a/src/test/compile-fail/main-wrong-type.rs +++ b/src/test/compile-fail/main-wrong-type.rs @@ -14,5 +14,5 @@ struct S { } fn main(foo: S) { -//~^ ERROR: main function has wrong type +//~^ ERROR: main function has wrong type [E0580] }