codex experiments

This commit is contained in:
Douglas Creager 2025-11-24 09:55:58 -05:00
parent 3a288ac814
commit 3bc3cedac8
1 changed files with 34 additions and 2 deletions

View File

@ -1082,6 +1082,15 @@ impl<'db> Node<'db> {
// specialization satisfies the constraint set. // specialization satisfies the constraint set.
let valid_specializations = typevar.valid_specializations(db); let valid_specializations = typevar.valid_specializations(db);
if !some_specialization_satisfies(valid_specializations.node) { if !some_specialization_satisfies(valid_specializations.node) {
if std::env::var("DEBUG_SAT").is_ok() {
let inferable_ids: Vec<_> = inferable.iter().collect();
eprintln!(
"inferable typevar {:?} no satisfying specialization for {} (inferable set: {:?})",
typevar.identity(db),
ConstraintSet { node: self }.display(db),
inferable_ids
);
}
return false; return false;
} }
} else { } else {
@ -1091,11 +1100,13 @@ impl<'db> Node<'db> {
// of those inferable typevars for each specialization of this non-inferable one. // of those inferable typevars for each specialization of this non-inferable one.
// To handle this, we use the sequent map to find which inferable typevars this // To handle this, we use the sequent map to find which inferable typevars this
// typevar depends on, and existentially abstract them away. // typevar depends on, and existentially abstract them away.
let inferable_ids: FxHashSet<_> = inferable.iter().collect();
let inferable_dependencies = interior let inferable_dependencies = interior
.sequent_map(db) .sequent_map(db)
.get_typevar_dependencies(typevar.identity(db)) .get_typevar_dependencies(typevar.identity(db))
.filter(|dependency| dependency.is_inferable(db, inferable)); .filter(|dep| inferable_ids.contains(dep));
let restricted = self.exists(db, inferable_dependencies); let inferable_dependencies: Vec<_> = inferable_dependencies.collect();
let restricted = self.exists(db, inferable_dependencies.iter().copied());
// Complicating things, the typevar might have gradual constraints. For those, we // Complicating things, the typevar might have gradual constraints. For those, we
// need to know the range of valid materializations, but we only need some // need to know the range of valid materializations, but we only need some
@ -1109,10 +1120,31 @@ impl<'db> Node<'db> {
let (static_specializations, gradual_constraints) = let (static_specializations, gradual_constraints) =
typevar.required_specializations(db); typevar.required_specializations(db);
if !all_specializations_satisfy(restricted, static_specializations) { if !all_specializations_satisfy(restricted, static_specializations) {
if std::env::var("DEBUG_SAT").is_ok() {
let inferable_ids: Vec<_> = inferable.iter().collect();
eprintln!(
"non-inferable typevar {:?} static specializations fail for {} (inferable set: {:?}, deps: {:?}, restricted: {}, restricted_always?: {})",
typevar.identity(db),
ConstraintSet { node: self }.display(db),
inferable_ids,
inferable_dependencies,
ConstraintSet { node: restricted }.display(db),
restricted.is_always_satisfied(db)
);
}
return false; return false;
} }
for gradual_constraint in gradual_constraints { for gradual_constraint in gradual_constraints {
if !some_specialization_satisfies(gradual_constraint) { if !some_specialization_satisfies(gradual_constraint) {
if std::env::var("DEBUG_SAT").is_ok() {
let inferable_ids: Vec<_> = inferable.iter().collect();
eprintln!(
"non-inferable typevar {:?} gradual constraint fails for {} (inferable set: {:?})",
typevar.identity(db),
ConstraintSet { node: self }.display(db),
inferable_ids
);
}
return false; return false;
} }
} }