Skip to content

Commit a787a23

Browse files
committed
test: fix sat resolver panic if a dep feature is missing
1 parent 1990793 commit a787a23

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

crates/resolver-tests/src/sat.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,25 +118,32 @@ fn process_pkg_features(
118118
dep_feature: dep_feature_name,
119119
weak,
120120
} => {
121+
let mut dep_clause = Vec::new();
122+
121123
for dep in &compatible_dep_summaries_by_name_in_toml[&dep_name] {
124+
let dep_feature_var_map =
125+
&var_for_is_packages_features_used[&dep.package_id()];
126+
127+
let Some(dep_feature_var) = dep_feature_var_map.get(&dep_feature_name)
128+
else {
129+
continue;
130+
};
131+
122132
let dep_var = var_for_is_packages_used[&dep.package_id()];
123-
let dep_feature_var =
124-
var_for_is_packages_features_used[&dep.package_id()][&dep_feature_name];
125133

126134
solver.add_clause(&[
127135
pkg_feature_var.negative(),
128136
dep_var.negative(),
129137
dep_feature_var.positive(),
130138
]);
139+
140+
if !weak {
141+
dep_clause.push(dep_var.positive());
142+
}
131143
}
132144

133145
if !weak {
134-
let dep_clause = compatible_dep_summaries_by_name_in_toml[&dep_name]
135-
.iter()
136-
.map(|dep| var_for_is_packages_used[&dep.package_id()].positive())
137-
.chain([pkg_feature_var.negative()])
138-
.collect::<Vec<_>>();
139-
146+
dep_clause.push(pkg_feature_var.negative());
140147
solver.add_clause(&dep_clause);
141148
}
142149
}

crates/resolver-tests/tests/validated.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,18 @@ fn missing_feature() {
165165
assert!(resolve_and_validated(vec!["a".with(&["f"])], &reg, &mut sat_resolver).is_err());
166166
}
167167

168+
#[test]
169+
fn missing_dep_feature() {
170+
let reg = registry(vec![
171+
pkg("a"),
172+
pkg_dep_with("dep", vec![dep("a")], &[("f", &["a/a"])]),
173+
]);
174+
175+
let deps = vec![dep("dep").with(&["f"])];
176+
let mut sat_resolver = SatResolver::new(&reg);
177+
assert!(resolve_and_validated(deps, &reg, &mut sat_resolver).is_err());
178+
}
179+
168180
#[test]
169181
fn conflict_feature_and_sys() {
170182
let reg = registry(vec![

0 commit comments

Comments
 (0)