Skip to content

Commit 03ccaa4

Browse files
committed
add unsize builtin impls
1 parent 13aa9d3 commit 03ccaa4

File tree

10 files changed

+479
-8
lines changed

10 files changed

+479
-8
lines changed

chalk-integration/src/lowering.rs

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

chalk-ir/src/debug.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ impl<I: Interner> Debug for DynTy<I> {
210210
write!(fmt, "dyn {:?} + {:?}", bounds, lifetime)
211211
}
212212
}
213-
214213
impl Debug for InferenceVar {
215214
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error> {
216215
write!(fmt, "?{}", self.index)

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
@@ -71,6 +71,7 @@ pub enum WellKnownTrait {
7171
FnOnce,
7272
FnMut,
7373
Fn,
74+
Unsize,
7475
}
7576

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

chalk-parse/src/parser.lalrpop

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

5960
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)