diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index 17f043cab15..44b24705acc 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -540,6 +540,18 @@ impl TomlManifest { } } + { + let mut names_sources = HashMap::new(); + for dep in deps.iter() { + let name = dep.name(); + let prev = names_sources.insert(name, dep.source_id()); + if prev.is_some() && prev != Some(dep.source_id()) { + bail!("found duplicate dependency name {}, but all \ + dependencies must have a unique name", name); + } + } + } + let exclude = project.exclude.clone().unwrap_or(Vec::new()); let include = project.include.clone().unwrap_or(Vec::new()); diff --git a/tests/test_bad_config.rs b/tests/test_bad_config.rs index afc91e8f65d..c0c36d0cded 100644 --- a/tests/test_bad_config.rs +++ b/tests/test_bad_config.rs @@ -383,6 +383,50 @@ Caused by: error = ERROR))); }); +test!(duplicate_deps { + let foo = project("foo") + .file("shim-bar/Cargo.toml", r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + "#) + .file("shim-bar/src/lib.rs", r#" + pub fn a() {} + "#) + .file("linux-bar/Cargo.toml", r#" + [package] + name = "bar" + version = "0.0.1" + authors = [] + "#) + .file("linux-bar/src/lib.rs", r#" + pub fn a() {} + "#) + .file("Cargo.toml", r#" + [package] + name = "qqq" + version = "0.0.1" + authors = [] + + [dependencies] + bar = { path = "shim-bar" } + + [target.x86_64-unknown-linux-gnu.dependencies] + bar = { path = "linux-bar" } + "#) + .file("src/main.rs", r#"fn main () {}"#); + + assert_that(foo.cargo_process("build"), + execs().with_status(101).with_stderr(&format!("\ +{error} failed to parse manifest at `[..]` + +Caused by: + found duplicate dependency name bar, but all dependencies must have a unique name +", + error = ERROR))); +}); + test!(unused_keys { let foo = project("foo") .file("Cargo.toml", r#"