Skip to content

Commit 60b3892

Browse files
committed
Use Floundered error in program_clauses
1 parent 27f9ef7 commit 60b3892

File tree

3 files changed

+13
-15
lines changed

3 files changed

+13
-15
lines changed

chalk-solve/src/clauses.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use self::env_elaborator::elaborate_env_clauses;
33
use self::program_clauses::ToProgramClauses;
44
use crate::split::Split;
55
use crate::RustIrDatabase;
6+
use chalk_engine::context::Floundered;
67
use chalk_ir::cast::Cast;
78
use chalk_ir::could_match::CouldMatch;
89
use chalk_ir::interner::Interner;
@@ -102,8 +103,6 @@ pub fn push_auto_trait_impls<I: Interner>(
102103
});
103104
}
104105

105-
// TODO add Floundered error instead of using Option
106-
107106
/// Given some goal `goal` that must be proven, along with
108107
/// its `environment`, figures out the program clauses that apply
109108
/// to this goal from the Rust program. So for example if the goal
@@ -113,7 +112,7 @@ pub(crate) fn program_clauses_for_goal<'db, I: Interner>(
113112
db: &'db dyn RustIrDatabase<I>,
114113
environment: &Environment<I>,
115114
goal: &DomainGoal<I>,
116-
) -> Option<Vec<ProgramClause<I>>> {
115+
) -> Result<Vec<ProgramClause<I>>, Floundered> {
117116
debug_heading!(
118117
"program_clauses_for_goal(goal={:?}, environment={:?})",
119118
goal,
@@ -129,7 +128,7 @@ pub(crate) fn program_clauses_for_goal<'db, I: Interner>(
129128

130129
debug!("vec = {:#?}", vec);
131130

132-
Some(vec)
131+
Ok(vec)
133132
}
134133

135134
/// Returns a set of program clauses that could possibly match
@@ -141,7 +140,7 @@ fn program_clauses_that_could_match<I: Interner>(
141140
environment: &Environment<I>,
142141
goal: &DomainGoal<I>,
143142
clauses: &mut Vec<ProgramClause<I>>,
144-
) -> Option<()> {
143+
) -> Result<(), Floundered> {
145144
let interner = db.interner();
146145
let builder = &mut ClauseBuilder::new(db, clauses);
147146

@@ -154,7 +153,7 @@ fn program_clauses_that_could_match<I: Interner>(
154153
if trait_datum.is_non_enumerable_trait() || trait_datum.is_auto_trait() {
155154
let self_ty = trait_ref.self_type_parameter(interner);
156155
if self_ty.bound(interner).is_some() || self_ty.inference_var(interner).is_some() {
157-
return None;
156+
return Err(Floundered);
158157
}
159158
}
160159

@@ -180,7 +179,7 @@ fn program_clauses_that_could_match<I: Interner>(
180179
}
181180
}
182181
TyData::InferenceVar(_) | TyData::BoundVar(_) => {
183-
return None;
182+
return Err(Floundered);
184183
}
185184
_ => {}
186185
}
@@ -306,7 +305,7 @@ fn program_clauses_that_could_match<I: Interner>(
306305
DomainGoal::Compatible(()) => (),
307306
};
308307

309-
Some(())
308+
Ok(())
310309
}
311310

312311
/// Generate program clauses from the associated-type values
@@ -367,9 +366,9 @@ fn match_ty<I: Interner>(
367366
builder: &mut ClauseBuilder<'_, I>,
368367
environment: &Environment<I>,
369368
ty: &Ty<I>,
370-
) -> Option<()> {
369+
) -> Result<(), Floundered> {
371370
let interner = builder.interner();
372-
Some(match ty.data(interner) {
371+
Ok(match ty.data(interner) {
373372
TyData::Apply(application_ty) => match_type_name(builder, application_ty.name),
374373
TyData::Placeholder(_) => {
375374
builder.push_clause(WellFormed::Ty(ty.clone()), Some(FromEnv::Ty(ty.clone())));
@@ -385,9 +384,9 @@ fn match_ty<I: Interner>(
385384
.iter(interner)
386385
.map(|p| p.assert_ty_ref(interner))
387386
.map(|ty| match_ty(builder, environment, &ty))
388-
.collect::<Option<_>>()?;
387+
.collect::<Result<_, Floundered>>()?;
389388
}
390-
TyData::BoundVar(_) | TyData::InferenceVar(_) => return None,
389+
TyData::BoundVar(_) | TyData::InferenceVar(_) => return Err(Floundered),
391390
TyData::Dyn(_) => {}
392391
})
393392
}

chalk-solve/src/recursive/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ impl<'me, I: Interner> Solver<'me, I> {
520520
environment: &Environment<I>,
521521
goal: &DomainGoal<I>,
522522
) -> Result<Vec<ProgramClause<I>>, Floundered> {
523-
program_clauses_for_goal(self.program, environment, goal).ok_or(Floundered)
523+
program_clauses_for_goal(self.program, environment, goal)
524524
}
525525
}
526526

chalk-solve/src/solve/slg.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,7 @@ impl<'me, I: Interner> context::ContextOps<SlgContext<I>> for SlgContextOps<'me,
177177
goal: &DomainGoal<I>,
178178
_infer: &mut TruncatingInferenceTable<I>,
179179
) -> Result<Vec<ProgramClause<I>>, Floundered> {
180-
let clauses: Vec<_> =
181-
program_clauses_for_goal(self.program, environment, goal).ok_or(Floundered)?;
180+
let clauses: Vec<_> = program_clauses_for_goal(self.program, environment, goal)?;
182181

183182
Ok(clauses)
184183
}

0 commit comments

Comments
 (0)