From 3d966d30ae2faa5e4bfd5b5d9821e618d056ed3f Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Tue, 5 Sep 2017 23:04:38 -0400 Subject: [PATCH] Allow features to be cyclical Fixes #3796 --- src/cargo/core/resolver/mod.rs | 12 +++++++++--- tests/features.rs | 6 ++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 4b633c26d..b720f5f4d 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -907,15 +907,22 @@ fn build_features<'a>(s: &'a Summary, method: &'a Method) } None => { let feat = feat_or_package; + + //if this feature has already been added, then just return Ok if !visited.insert(feat) { - bail!("Cyclic feature dependency: feature `{}` depends \ - on itself", feat) + return Ok(()); } + used.insert(feat); match s.features().get(feat) { Some(recursive) => { // This is a feature, add it recursively. for f in recursive { + if f == feat { + bail!("Cyclic feature dependency: feature `{}` depends \ + on itself", feat); + } + add_feature(s, f, deps, used, visited)?; } } @@ -924,7 +931,6 @@ fn build_features<'a>(s: &'a Summary, method: &'a Method) deps.entry(feat).or_insert((false, Vec::new())).0 = true; } } - visited.remove(feat); } } Ok(()) diff --git a/tests/features.rs b/tests/features.rs index bbc78b942..0406f7cb3 100644 --- a/tests/features.rs +++ b/tests/features.rs @@ -480,12 +480,10 @@ fn cyclic_feature2() { foo = ["bar"] bar = ["foo"] "#) - .file("src/main.rs", ""); + .file("src/main.rs", "fn main() {}"); assert_that(p.cargo_process("build"), - execs().with_status(101).with_stderr("\ -[ERROR] Cyclic feature dependency: feature `[..]` depends on itself -")); + execs().with_status(0).with_stdout("")); } #[test] -- 2.30.2