diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 28b328132d2..8dca4660d31 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -1009,6 +1009,15 @@ fn check_cycles(resolve: &Resolve) -> CargoResult<()> { for id in resolve.iter() { let map = graph.entry(id).or_insert_with(BTreeMap::new); for (dep_id, listings) in resolve.deps_not_replaced(id) { + // We don't want to allow a package to depend on itself as a path. + // See https://github.com/rust-lang/cargo/issues/9518 for more details. + if id == dep_id && dep_id.source_id().is_path() { + anyhow::bail!( + "cyclic package dependency: package `{}` depends on itself.", + id, + ); + } + let transitive_dep = listings.iter().find(|d| d.is_transitive()); if let Some(transitive_dep) = transitive_dep.cloned() { diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs index 487965e432e..3549bc48823 100644 --- a/tests/testsuite/build.rs +++ b/tests/testsuite/build.rs @@ -1660,9 +1660,34 @@ fn self_dependency() { .with_status(101) .with_stderr( "\ -[ERROR] cyclic package dependency: package `test v0.0.0 ([CWD])` depends on itself. Cycle: -package `test v0.0.0 ([CWD])` - ... which satisfies path dependency `test` of package `test v0.0.0 ([..])`", +[ERROR] cyclic package dependency: package `test v0.0.0 ([CWD])` depends on itself.", + ) + .run(); +} + +#[cargo_test] +fn dev_self_dependency() { + let p = project() + .file( + "Cargo.toml", + r#" + [project] + name = "foo" + version = "0.1.0" + authors = [] + + [dev-dependencies] + foo = { path = "." } + "#, + ) + .file("src/lib.rs", "") + .build(); + + p.cargo("check") + .with_status(101) + .with_stderr( + "\ +[ERROR] cyclic package dependency: package `foo v0.1.0 ([CWD])` depends on itself.", ) .run(); } diff --git a/tests/testsuite/features2.rs b/tests/testsuite/features2.rs index f1f1222a078..76e8ab17466 100644 --- a/tests/testsuite/features2.rs +++ b/tests/testsuite/features2.rs @@ -695,18 +695,14 @@ fn cyclical_dev_dep() { ) .build(); - // Old way unifies features. - p.cargo("run true").run(); - // dev feature should always be enabled in tests. - p.cargo("test").run(); - - // New behavior. - switch_to_resolver_2(&p); - // Should decouple main. - p.cargo("run false").run(); - - // And this should be no different. - p.cargo("test").run(); + // TODO: Figure out how to properly fix this test case. + p.cargo("run true") + .with_status(101) + .with_stderr( + "\ +[ERROR] cyclic package dependency: package `foo v0.1.0 ([CWD])` depends on itself.", + ) + .run(); } #[cargo_test] diff --git a/tests/testsuite/test.rs b/tests/testsuite/test.rs index eb66bc77c00..53728d5a13d 100644 --- a/tests/testsuite/test.rs +++ b/tests/testsuite/test.rs @@ -3366,7 +3366,13 @@ fn cyclic_dev() { .file("tests/foo.rs", "extern crate foo;") .build(); - p.cargo("test --workspace").run(); + p.cargo("test --workspace") + .with_status(101) + .with_stderr( + "\ +[ERROR] cyclic package dependency: package `foo v0.1.0 ([CWD])` depends on itself.", + ) + .run(); } #[cargo_test]