Skip to content

Commit 5b6ef58

Browse files
authored
Merge pull request #427 from Areredify/unsize
add `Unsize` trait implementation
2 parents ed5b8a2 + 4189525 commit 5b6ef58

File tree

21 files changed

+1593
-446
lines changed

21 files changed

+1593
-446
lines changed

chalk-engine/src/logic.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use crate::{
1313
use chalk_ir::interner::Interner;
1414
use chalk_ir::{debug, debug_heading, info, info_heading};
1515
use chalk_ir::{
16-
Canonical, ConstrainedSubst, Floundered, Goal, GoalData, InEnvironment, NoSolution,
17-
Substitution, UCanonical, UniverseMap,
16+
Canonical, ConstrainedSubst, DomainGoal, Floundered, Goal, GoalData, InEnvironment, NoSolution,
17+
Substitution, UCanonical, UniverseMap, WhereClause,
1818
};
1919

2020
type RootSearchResult<T> = Result<T, RootSearchFail>;
@@ -251,8 +251,18 @@ impl<I: Interner, C: Context<I>> Forest<I, C> {
251251
) -> Table<I> {
252252
let mut table = Table::new(goal.clone(), context.is_coinductive(&goal));
253253
let (mut infer, subst, environment, goal) = context.instantiate_ucanonical_goal(&goal);
254-
match goal.data(context.interner()) {
255-
GoalData::DomainGoal(domain_goal) => {
254+
let goal_data = goal.data(context.interner());
255+
256+
let is_outlives_goal = |dg: &DomainGoal<I>| {
257+
if let DomainGoal::Holds(WhereClause::LifetimeOutlives(_)) = dg {
258+
true
259+
} else {
260+
false
261+
}
262+
};
263+
264+
match goal_data {
265+
GoalData::DomainGoal(domain_goal) if !is_outlives_goal(domain_goal) => {
256266
match context.program_clauses(&environment, &domain_goal, &mut infer) {
257267
Ok(clauses) => {
258268
for clause in clauses {

chalk-integration/src/lowering.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,7 @@ impl LowerWellKnownTrait for WellKnownTrait {
18281828
Self::FnOnce => rust_ir::WellKnownTrait::FnOnce,
18291829
Self::FnMut => rust_ir::WellKnownTrait::FnMut,
18301830
Self::Fn => rust_ir::WellKnownTrait::Fn,
1831+
Self::Unsize => rust_ir::WellKnownTrait::Unsize,
18311832
}
18321833
}
18331834
}

chalk-ir/src/lib.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,15 @@ impl<I: Interner> WhereClause<I> {
13511351
wc => wc.cast(interner),
13521352
}
13531353
}
1354+
1355+
/// If where clause is a `TraitRef`, returns its trait id
1356+
pub fn trait_id(&self) -> Option<TraitId<I>> {
1357+
match self {
1358+
WhereClause::Implemented(trait_ref) => Some(trait_ref.trait_id),
1359+
WhereClause::AliasEq(_) => None,
1360+
WhereClause::LifetimeOutlives(_) => None,
1361+
}
1362+
}
13541363
}
13551364

13561365
impl<I: Interner> QuantifiedWhereClause<I> {
@@ -1369,6 +1378,11 @@ impl<I: Interner> QuantifiedWhereClause<I> {
13691378
pub fn into_from_env_goal(self, interner: &I) -> Binders<DomainGoal<I>> {
13701379
self.map(|wc| wc.into_from_env_goal(interner))
13711380
}
1381+
1382+
/// If the underlying where clause is a `TraitRef`, returns its trait id
1383+
pub fn trait_id(&self) -> Option<TraitId<I>> {
1384+
self.skip_binders().trait_id()
1385+
}
13721386
}
13731387

13741388
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, HasInterner)]

chalk-parse/src/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub enum WellKnownTrait {
7272
FnOnce,
7373
FnMut,
7474
Fn,
75+
Unsize,
7576
}
7677

7778
#[derive(Clone, PartialEq, Eq, Debug)]

chalk-parse/src/parser.lalrpop

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ WellKnownTrait: WellKnownTrait = {
5555
"#" "[" "lang" "(" "fn_once" ")" "]" => WellKnownTrait::FnOnce,
5656
"#" "[" "lang" "(" "fn_mut" ")" "]" => WellKnownTrait::FnMut,
5757
"#" "[" "lang" "(" "fn" ")" "]" => WellKnownTrait::Fn,
58+
"#" "[" "lang" "(" "unsize" ")" "]" => WellKnownTrait::Unsize,
5859
};
5960

6061
StructDefn: StructDefn = {

chalk-solve/src/clauses/builtin_traits.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod clone;
66
mod copy;
77
mod fn_family;
88
mod sized;
9+
mod unsize;
910

1011
/// For well known traits we have special hard-coded impls, either as an
1112
/// optimization or to enforce special rules for correctness.
@@ -36,6 +37,9 @@ pub fn add_builtin_program_clauses<I: Interner>(
3637
WellKnownTrait::FnOnce | WellKnownTrait::FnMut | WellKnownTrait::Fn => {
3738
fn_family::add_fn_trait_program_clauses(db, builder, trait_ref.trait_id, self_ty)?
3839
}
40+
WellKnownTrait::Unsize => {
41+
unsize::add_unsize_program_clauses(db, builder, &trait_ref, ty)
42+
}
3943
// Drop impls are provided explicitly
4044
WellKnownTrait::Drop => (),
4145
}

0 commit comments

Comments
 (0)