Skip to content

Commit 0b3f90d

Browse files
authored
Merge pull request #367 from jackh726/builtin_stopgap
Stopgap solution for builtin traits
2 parents e3f8228 + 733b952 commit 0b3f90d

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

chalk-rust-ir/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ pub struct TraitDatum<I: Interner> {
135135
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
136136
pub enum WellKnownTrait {
137137
SizedTrait,
138+
CopyTrait,
139+
CloneTrait,
138140
}
139141

140142
impl<I: Interner> TraitDatum<I> {

chalk-solve/src/clauses.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,13 @@ fn program_clauses_that_could_match<I: Interner>(
238238
}
239239

240240
if let Some(well_known) = trait_datum.well_known {
241-
builtin_traits::add_builtin_program_clauses(well_known, trait_ref, builder);
241+
builtin_traits::add_builtin_program_clauses(
242+
db,
243+
builder,
244+
well_known,
245+
trait_ref,
246+
self_ty.data(interner),
247+
);
242248
}
243249
}
244250
DomainGoal::Holds(WhereClause::AliasEq(alias_predicate)) => {
@@ -346,16 +352,21 @@ fn match_ty<I: Interner>(
346352
let interner = builder.interner();
347353
match ty.data(interner) {
348354
TyData::Apply(application_ty) => match_type_name(builder, application_ty.name),
349-
TyData::Placeholder(_) => {}
355+
TyData::Placeholder(_) => {
356+
builder.push_clause(WellFormed::Ty(ty.clone()), Some(FromEnv::Ty(ty.clone())));
357+
}
350358
TyData::Alias(alias_ty) => builder
351359
.db
352360
.associated_ty_data(alias_ty.associated_ty_id)
353361
.to_program_clauses(builder),
354-
TyData::Function(quantified_ty) => quantified_ty
355-
.parameters
356-
.iter()
357-
.map(|p| p.assert_ty_ref(interner))
358-
.for_each(|ty| match_ty(builder, environment, &ty)),
362+
TyData::Function(quantified_ty) => {
363+
builder.push_fact(WellFormed::Ty(ty.clone()));
364+
quantified_ty
365+
.parameters
366+
.iter()
367+
.map(|p| p.assert_ty_ref(interner))
368+
.for_each(|ty| match_ty(builder, environment, &ty))
369+
}
359370
TyData::BoundVar(_) => {}
360371
TyData::InferenceVar(_) => panic!("should have floundered"),
361372
TyData::Dyn(_) => {}
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
use super::builder::ClauseBuilder;
2-
use crate::Interner;
3-
use crate::{TraitRef, WellKnownTrait};
2+
use crate::{Interner, RustIrDatabase, TraitRef, WellKnownTrait};
3+
use chalk_ir::TyData;
44

55
/// For well known traits we have special hard-coded impls, either as an
66
/// optimization or to enforce special rules for correctness.
77
pub fn add_builtin_program_clauses<I: Interner>(
8+
db: &dyn RustIrDatabase<I>,
9+
builder: &mut ClauseBuilder<'_, I>,
810
well_known: WellKnownTrait,
9-
_trait_ref: &TraitRef<I>,
10-
_builder: &mut ClauseBuilder<'_, I>,
11+
trait_ref: &TraitRef<I>,
12+
ty: &TyData<I>,
1113
) {
14+
if db.force_impl_for(well_known, ty) {
15+
builder.push_fact(trait_ref.clone());
16+
}
17+
1218
match well_known {
1319
WellKnownTrait::SizedTrait => { /* TODO */ }
20+
WellKnownTrait::CopyTrait => { /* TODO */ }
21+
WellKnownTrait::CloneTrait => { /* TODO */ }
1422
}
1523
}

chalk-solve/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ pub trait RustIrDatabase<I: Interner>: Debug {
6868
/// user gave).
6969
fn impl_provided_for(&self, auto_trait_id: TraitId<I>, struct_id: StructId<I>) -> bool;
7070

71+
/// A stop-gap solution to force an impl for a given well-known trait.
72+
/// Useful when the logic for a given trait is absent or incomplete.
73+
#[allow(unused_variables)]
74+
fn force_impl_for(&self, well_known: WellKnownTrait, ty: &TyData<I>) -> bool {
75+
false
76+
}
77+
7178
fn interner(&self) -> &I;
7279
}
7380

0 commit comments

Comments
 (0)