Skip to content

Commit 2cbebf4

Browse files
committed
add unsize builtin impls
1 parent b576b25 commit 2cbebf4

File tree

10 files changed

+480
-8
lines changed

10 files changed

+480
-8
lines changed

chalk-integration/src/lowering.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,7 @@ impl LowerWellKnownTrait for WellKnownTrait {
18221822
Self::CopyTrait => rust_ir::WellKnownTrait::CopyTrait,
18231823
Self::CloneTrait => rust_ir::WellKnownTrait::CloneTrait,
18241824
Self::DropTrait => rust_ir::WellKnownTrait::DropTrait,
1825+
Self::UnsizeTrait => rust_ir::WellKnownTrait::UnsizeTrait,
18251826
}
18261827
}
18271828
}

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
@@ -68,6 +68,7 @@ pub enum WellKnownTrait {
6868
CopyTrait,
6969
CloneTrait,
7070
DropTrait,
71+
UnsizeTrait,
7172
}
7273

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

chalk-parse/src/parser.lalrpop

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ WellKnownTrait: WellKnownTrait = {
5151
"#" "[" "lang" "(" "copy" ")" "]" => WellKnownTrait::CopyTrait,
5252
"#" "[" "lang" "(" "clone" ")" "]" => WellKnownTrait::CloneTrait,
5353
"#" "[" "lang" "(" "drop" ")" "]" => WellKnownTrait::DropTrait,
54+
"#" "[" "lang" "(" "unsize" ")" "]" => WellKnownTrait::UnsizeTrait,
5455
};
5556

5657
StructDefn: StructDefn = {

chalk-solve/src/clauses/builtin_traits.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use chalk_ir::{Substitution, Ty};
55
mod clone;
66
mod copy;
77
mod sized;
8+
mod unsize;
89

910
/// For well known traits we have special hard-coded impls, either as an
1011
/// optimization or to enforce special rules for correctness.
@@ -38,6 +39,9 @@ pub fn add_builtin_program_clauses<I: Interner>(
3839
WellKnownTrait::CloneTrait => {
3940
clone::add_clone_program_clauses(db, builder, &trait_ref, ty)
4041
}
42+
WellKnownTrait::UnsizeTrait => {
43+
unsize::add_unsize_program_clauses(db, builder, &trait_ref, ty)
44+
}
4145
// Drop impls are provided explicitly
4246
WellKnownTrait::DropTrait => (),
4347
}

0 commit comments

Comments
 (0)