Skip to content

Commit 900fc25

Browse files
committed
add unsize builtin impls
1 parent 1d269d3 commit 900fc25

File tree

10 files changed

+480
-6
lines changed

10 files changed

+480
-6
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::Copy => rust_ir::WellKnownTrait::Copy,
18231823
Self::Clone => rust_ir::WellKnownTrait::Clone,
18241824
Self::Drop => rust_ir::WellKnownTrait::Drop,
1825+
Self::Unsize => rust_ir::WellKnownTrait::Unsize,
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
Copy,
6969
Clone,
7070
Drop,
71+
Unsize,
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::Copy,
5252
"#" "[" "lang" "(" "clone" ")" "]" => WellKnownTrait::Clone,
5353
"#" "[" "lang" "(" "drop" ")" "]" => WellKnownTrait::Drop,
54+
"#" "[" "lang" "(" "unsize" ")" "]" => WellKnownTrait::Unsize,
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.
@@ -32,6 +33,9 @@ pub fn add_builtin_program_clauses<I: Interner>(
3233
WellKnownTrait::Sized => sized::add_sized_program_clauses(db, builder, &trait_ref, ty),
3334
WellKnownTrait::Copy => copy::add_copy_program_clauses(db, builder, &trait_ref, ty),
3435
WellKnownTrait::Clone => clone::add_clone_program_clauses(db, builder, &trait_ref, ty),
36+
WellKnownTrait::Unsize => {
37+
unsize::add_unsize_program_clauses(db, builder, &trait_ref, ty)
38+
}
3539
// Drop impls are provided explicitly
3640
WellKnownTrait::Drop => (),
3741
}

0 commit comments

Comments
 (0)