diff --git a/src/cargo/core/workspace.rs b/src/cargo/core/workspace.rs index 9922d6d331d..702c1929a69 100644 --- a/src/cargo/core/workspace.rs +++ b/src/cargo/core/workspace.rs @@ -15,7 +15,7 @@ use crate::core::features::Features; use crate::core::registry::PackageRegistry; use crate::core::resolver::features::CliFeatures; use crate::core::resolver::ResolveBehavior; -use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec}; +use crate::core::{Dependency, Edition, FeatureValue, PackageId, PackageIdSpec}; use crate::core::{EitherManifest, Package, SourceId, VirtualManifest}; use crate::ops; use crate::sources::{PathSource, CRATES_IO_INDEX, CRATES_IO_REGISTRY}; @@ -993,6 +993,24 @@ impl<'cfg> Workspace<'cfg> { } } } + if let MaybePackage::Virtual(vm) = self.root_maybe() { + if vm.resolve_behavior().is_none() { + if let Some(edition) = self + .members() + .filter(|p| p.manifest_path() != root_manifest) + .map(|p| p.manifest().edition()) + .filter(|&e| e >= Edition::Edition2021) + .max() + { + let resolver = edition.default_resolve_behavior().to_manifest(); + self.config.shell().warn(format_args!("some crates are on edition {edition} which defaults to `resolver = \"{resolver}\"`, but virtual workspaces default to `resolver = \"1\"`"))?; + self.config.shell().note( + "to keep the current resolver, specify `workspace.resolver = \"1\"` in the workspace root's manifest", + )?; + self.config.shell().note(format_args!("to use the edition {edition} resolver, specify `workspace.resolver = \"{resolver}\"` in the workspace root's manifest"))?; + } + } + } } Ok(()) } diff --git a/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml index 8c235325c50..55ee0423c7e 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_lints/in/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["crates/*"] [workspace.lints.rust] diff --git a/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml index 8c235325c50..55ee0423c7e 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_lints/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = ["crates/*"] [workspace.lints.rust] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table.in/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_edition/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml index b7a2e90363d..cef4dd48b20 100644 --- a/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml +++ b/tests/testsuite/cargo_new/inherit_workspace_package_table_with_registry/out/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "crates/*", ] diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index 494c83f1e50..68fecb863a8 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -1406,6 +1406,41 @@ workspace: [..]/foo/Cargo.toml .run(); } +#[cargo_test] +fn edition_2021_workspace_member() { + let p = project() + .file( + "Cargo.toml", + r#" + [workspace] + members = ["a"] + "#, + ) + .file( + "a/Cargo.toml", + r#" + [package] + name = "a" + version = "0.1.0" + edition = "2021" + "#, + ) + .file("a/src/lib.rs", "") + .build(); + + p.cargo("check") + .with_stderr( + "\ +warning: some crates are on edition 2021 which defaults to `resolver = \"2\"`, but virtual workspaces default to `resolver = \"1\"` +note: to keep the current resolver, specify `workspace.resolver = \"1\"` in the workspace root's manifest +note: to use the edition 2021 resolver, specify `workspace.resolver = \"2\"` in the workspace root's manifest +[CHECKING] a v0.1.0 [..] +[FINISHED] [..] +", + ) + .run(); +} + #[cargo_test] fn resolver_ws_root_and_member() { // Check when specified in both ws root and member.