diff --git a/src/cargo/core/features.rs b/src/cargo/core/features.rs index f7b70496848..eb2b80fbe5e 100644 --- a/src/cargo/core/features.rs +++ b/src/cargo/core/features.rs @@ -82,6 +82,11 @@ impl FromStr for Edition { match s { "2015" => Ok(Edition::Edition2015), "2018" => Ok(Edition::Edition2018), + s if s.parse().map_or(false, |y: u16| y > 2020 && y < 2050) => bail!( + "this version of Cargo is older than the `{}` edition, \ + and only supports `2015` and `2018` editions.", + s + ), s => bail!( "supported edition values are `2015` or `2018`, but `{}` \ is unknown", diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index b12a75eca95..16c79fcfa5f 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -1066,6 +1066,38 @@ Caused by: .run(); } +#[cargo_test] +fn test_edition_from_the_future() { + let p = project() + .file( + "Cargo.toml", + r#"[package] + edition = "2038" + name = "foo" + version = "99.99.99" + authors = [] + "#, + ) + .file("src/main.rs", r#""#) + .build(); + + p.cargo("build") + .with_status(101) + .with_stderr( + "\ +error: failed to parse manifest at `[..]` + +Caused by: + failed to parse the `edition` key + +Caused by: + this version of Cargo is older than the `2038` edition, and only supports `2015` and `2018` editions. +" + .to_string(), + ) + .run(); +} + #[cargo_test] fn do_not_package_if_src_was_modified() { let p = project()