Skip to content

Commit 89b202c

Browse files
committed
add discriminant repr and DiscriminantKind assoc type
1 parent 8e3dc57 commit 89b202c

File tree

18 files changed

+422
-79
lines changed

18 files changed

+422
-79
lines changed

chalk-integration/src/db.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ impl RustIrDatabase<ChalkIr> for ChalkDatabase {
118118
self.program_ir().unwrap().generator_witness_datum(id)
119119
}
120120

121-
fn adt_repr(&self, id: AdtId<ChalkIr>) -> AdtRepr {
121+
fn adt_repr(&self, id: AdtId<ChalkIr>) -> Arc<AdtRepr<ChalkIr>> {
122122
self.program_ir().unwrap().adt_repr(id)
123123
}
124124

@@ -227,6 +227,10 @@ impl RustIrDatabase<ChalkIr> for ChalkDatabase {
227227
fn fn_def_name(&self, fn_def_id: FnDefId<ChalkIr>) -> String {
228228
self.program_ir().unwrap().fn_def_name(fn_def_id)
229229
}
230+
231+
fn discriminant_type(&self, ty: Ty<ChalkIr>) -> Ty<ChalkIr> {
232+
self.program_ir().unwrap().discriminant_type(ty)
233+
}
230234
}
231235

232236
impl fmt::Debug for ChalkDatabase {

chalk-integration/src/lowering.rs

Lines changed: 52 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -316,14 +316,15 @@ impl LowerWithEnv for (&AdtDefn, chalk_ir::AdtId<ChalkIr>) {
316316
}
317317
}
318318

319-
impl Lower for AdtRepr {
320-
type Lowered = rust_ir::AdtRepr;
319+
impl LowerWithEnv for AdtRepr {
320+
type Lowered = rust_ir::AdtRepr<ChalkIr>;
321321

322-
fn lower(&self) -> Self::Lowered {
323-
rust_ir::AdtRepr {
324-
repr_c: self.repr_c,
325-
repr_packed: self.repr_packed,
326-
}
322+
fn lower(&self, env: &Env) -> LowerResult<Self::Lowered> {
323+
Ok(rust_ir::AdtRepr {
324+
c: self.c,
325+
packed: self.packed,
326+
int: self.int.as_ref().map(|i| i.lower(env)).transpose()?,
327+
})
327328
}
328329
}
329330

@@ -1148,31 +1149,55 @@ impl Kinded for chalk_ir::GenericArg<ChalkIr> {
11481149
}
11491150
}
11501151

1152+
impl Lower for IntTy {
1153+
type Lowered = chalk_ir::IntTy;
1154+
1155+
fn lower(&self) -> Self::Lowered {
1156+
match self {
1157+
IntTy::I8 => chalk_ir::IntTy::I8,
1158+
IntTy::I16 => chalk_ir::IntTy::I16,
1159+
IntTy::I32 => chalk_ir::IntTy::I32,
1160+
IntTy::I64 => chalk_ir::IntTy::I64,
1161+
IntTy::I128 => chalk_ir::IntTy::I128,
1162+
IntTy::Isize => chalk_ir::IntTy::Isize,
1163+
}
1164+
}
1165+
}
1166+
1167+
impl Lower for UintTy {
1168+
type Lowered = chalk_ir::UintTy;
1169+
1170+
fn lower(&self) -> Self::Lowered {
1171+
match self {
1172+
UintTy::U8 => chalk_ir::UintTy::U8,
1173+
UintTy::U16 => chalk_ir::UintTy::U16,
1174+
UintTy::U32 => chalk_ir::UintTy::U32,
1175+
UintTy::U64 => chalk_ir::UintTy::U64,
1176+
UintTy::U128 => chalk_ir::UintTy::U128,
1177+
UintTy::Usize => chalk_ir::UintTy::Usize,
1178+
}
1179+
}
1180+
}
1181+
1182+
impl Lower for FloatTy {
1183+
type Lowered = chalk_ir::FloatTy;
1184+
1185+
fn lower(&self) -> Self::Lowered {
1186+
match self {
1187+
FloatTy::F32 => chalk_ir::FloatTy::F32,
1188+
FloatTy::F64 => chalk_ir::FloatTy::F64,
1189+
}
1190+
}
1191+
}
1192+
11511193
impl Lower for ScalarType {
11521194
type Lowered = chalk_ir::Scalar;
11531195

11541196
fn lower(&self) -> Self::Lowered {
11551197
match self {
1156-
ScalarType::Int(int) => chalk_ir::Scalar::Int(match int {
1157-
IntTy::I8 => chalk_ir::IntTy::I8,
1158-
IntTy::I16 => chalk_ir::IntTy::I16,
1159-
IntTy::I32 => chalk_ir::IntTy::I32,
1160-
IntTy::I64 => chalk_ir::IntTy::I64,
1161-
IntTy::I128 => chalk_ir::IntTy::I128,
1162-
IntTy::Isize => chalk_ir::IntTy::Isize,
1163-
}),
1164-
ScalarType::Uint(uint) => chalk_ir::Scalar::Uint(match uint {
1165-
UintTy::U8 => chalk_ir::UintTy::U8,
1166-
UintTy::U16 => chalk_ir::UintTy::U16,
1167-
UintTy::U32 => chalk_ir::UintTy::U32,
1168-
UintTy::U64 => chalk_ir::UintTy::U64,
1169-
UintTy::U128 => chalk_ir::UintTy::U128,
1170-
UintTy::Usize => chalk_ir::UintTy::Usize,
1171-
}),
1172-
ScalarType::Float(float) => chalk_ir::Scalar::Float(match float {
1173-
FloatTy::F32 => chalk_ir::FloatTy::F32,
1174-
FloatTy::F64 => chalk_ir::FloatTy::F64,
1175-
}),
1198+
ScalarType::Int(int) => chalk_ir::Scalar::Int(int.lower()),
1199+
ScalarType::Uint(uint) => chalk_ir::Scalar::Uint(uint.lower()),
1200+
ScalarType::Float(float) => chalk_ir::Scalar::Float(float.lower()),
11761201
ScalarType::Bool => chalk_ir::Scalar::Bool,
11771202
ScalarType::Char => chalk_ir::Scalar::Char,
11781203
}

chalk-integration/src/lowering/program_lowerer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl ProgramLowerer {
182182
Item::AdtDefn(ref d) => {
183183
let adt_id = AdtId(raw_id);
184184
adt_data.insert(adt_id, Arc::new((d, adt_id).lower(&empty_env)?));
185-
adt_reprs.insert(adt_id, d.repr.lower());
185+
adt_reprs.insert(adt_id, Arc::new(d.repr.lower(&empty_env)?));
186186
}
187187
Item::FnDefn(ref defn) => {
188188
let fn_def_id = FnDefId(raw_id);

chalk-integration/src/program.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use chalk_ir::could_match::CouldMatch;
44
use chalk_ir::debug::Angle;
55
use chalk_ir::{
66
debug::SeparatorTraitRef, AdtId, AliasTy, AssocTypeId, Binders, CanonicalVarKinds, ClosureId,
7-
FnDefId, ForeignDefId, GeneratorId, GenericArg, Goal, Goals, ImplId, Lifetime, OpaqueTy,
8-
OpaqueTyId, ProgramClause, ProgramClauseImplication, ProgramClauses, ProjectionTy,
9-
Substitution, TraitId, Ty, TyKind,
7+
FnDefId, ForeignDefId, GeneratorId, GenericArg, Goal, Goals, ImplId, IntTy, Lifetime, OpaqueTy,
8+
OpaqueTyId, ProgramClause, ProgramClauseImplication, ProgramClauses, ProjectionTy, Scalar,
9+
Substitution, TraitId, Ty, TyKind, UintTy,
1010
};
1111
use chalk_solve::rust_ir::{
1212
AdtDatum, AdtRepr, AssociatedTyDatum, AssociatedTyValue, AssociatedTyValueId, ClosureKind,
@@ -55,7 +55,7 @@ pub struct Program {
5555
/// For each ADT:
5656
pub adt_data: BTreeMap<AdtId<ChalkIr>, Arc<AdtDatum<ChalkIr>>>,
5757

58-
pub adt_reprs: BTreeMap<AdtId<ChalkIr>, AdtRepr>,
58+
pub adt_reprs: BTreeMap<AdtId<ChalkIr>, Arc<AdtRepr<ChalkIr>>>,
5959

6060
pub fn_def_data: BTreeMap<FnDefId<ChalkIr>, Arc<FnDefDatum<ChalkIr>>>,
6161

@@ -391,8 +391,8 @@ impl RustIrDatabase<ChalkIr> for Program {
391391
self.generator_witness_data[&id].clone()
392392
}
393393

394-
fn adt_repr(&self, id: AdtId<ChalkIr>) -> AdtRepr {
395-
self.adt_reprs[&id]
394+
fn adt_repr(&self, id: AdtId<ChalkIr>) -> Arc<AdtRepr<ChalkIr>> {
395+
self.adt_reprs[&id].clone()
396396
}
397397

398398
fn fn_def_datum(&self, id: FnDefId<ChalkIr>) -> Arc<FnDefDatum<ChalkIr>> {
@@ -549,4 +549,19 @@ impl RustIrDatabase<ChalkIr> for Program {
549549
.name
550550
.to_string()
551551
}
552+
553+
// Mirrors current (07a63e6d1fabf3560e8e1e17c1d56b10a06152d9) implementation in rustc
554+
fn discriminant_type(&self, ty: Ty<ChalkIr>) -> Ty<ChalkIr> {
555+
let interner = self.interner();
556+
match ty.data(interner).kind {
557+
TyKind::Adt(id, _) => {
558+
let repr = self.adt_repr(id);
559+
repr.int
560+
.clone()
561+
.unwrap_or(TyKind::Scalar(Scalar::Int(IntTy::Isize)).intern(interner))
562+
}
563+
TyKind::Generator(..) => TyKind::Scalar(Scalar::Uint(UintTy::U32)).intern(interner),
564+
_ => TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(interner),
565+
}
566+
}
552567
}

chalk-parse/src/ast.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,18 @@ pub enum AdtKind {
7777
Union,
7878
}
7979

80+
#[derive(Clone, PartialEq, Eq, Debug)]
81+
pub enum AdtReprAttr {
82+
C,
83+
Packed,
84+
Int(Ty),
85+
}
86+
8087
#[derive(Clone, PartialEq, Eq, Debug)]
8188
pub struct AdtRepr {
82-
pub repr_c: bool,
83-
pub repr_packed: bool,
89+
pub c: bool,
90+
pub packed: bool,
91+
pub int: Option<Ty>,
8492
}
8593

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

chalk-parse/src/parser.lalrpop

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,28 @@ WellKnownTraitName: WellKnownTrait = {
7272
"discriminant_kind" => WellKnownTrait::DiscriminantKind,
7373
};
7474

75-
AdtRepr: Atom = "#" "[" "repr" "(" <name:Id> ")" "]" => name.str;
75+
AdtReprAttr: AdtReprAttr = {
76+
"#" "[" "repr" "(" <t:ReprIntTy> ")" "]" => AdtReprAttr::Int(t),
77+
"#" "[" "repr" "(" <attr:Id> ")" "]" =>? match &*attr.str {
78+
"C" => Ok(AdtReprAttr::C),
79+
"packed" => Ok(AdtReprAttr::Packed),
80+
_ => Err(lalrpop_util::ParseError::User {
81+
error: "unknown adt repr flag"
82+
})
83+
},
84+
};
85+
86+
ReprIntTy: Ty = {
87+
<i:IntTy> => Ty::Scalar {
88+
ty: ScalarType::Int(i),
89+
},
90+
<u:UintTy> => Ty::Scalar {
91+
ty: ScalarType::Uint(u),
92+
},
93+
}
7694

7795
AdtDefn: AdtDefn = {
78-
<upstream:UpstreamKeyword?> <fundamental:FundamentalKeyword?> <phantom_data:PhantomDataKeyword?> <repr:AdtRepr*>
96+
<upstream:UpstreamKeyword?> <fundamental:FundamentalKeyword?> <phantom_data:PhantomDataKeyword?> <repr:AdtReprAttr*>
7997
"enum" <n:Id><p:Angle<VariableKind>>
8098
<w:QuantifiedWhereClauses> "{" <v:Variants> "}" => AdtDefn
8199
{
@@ -90,11 +108,16 @@ AdtDefn: AdtDefn = {
90108
kind: AdtKind::Enum,
91109
},
92110
repr: AdtRepr {
93-
repr_c: repr.iter().any(|s| s == "C"),
94-
repr_packed: repr.iter().any(|s| s == "packed"),
111+
c: repr.iter().any(|s| s == &AdtReprAttr::C),
112+
packed: repr.iter().any(|s| s == &AdtReprAttr::Packed),
113+
int: repr.iter().find_map(|s| if let AdtReprAttr::Int(i) = s {
114+
Some(i.clone())
115+
} else {
116+
None
117+
})
95118
},
96119
},
97-
<upstream:UpstreamKeyword?> <fundamental:FundamentalKeyword?> <phantom_data:PhantomDataKeyword?> <repr:AdtRepr*>
120+
<upstream:UpstreamKeyword?> <fundamental:FundamentalKeyword?> <phantom_data:PhantomDataKeyword?> <repr:AdtReprAttr*>
98121
"struct" <n:Id><p:Angle<VariableKind>>
99122
<w:QuantifiedWhereClauses> "{" <f:Fields> "}" => AdtDefn
100123
{
@@ -116,8 +139,9 @@ AdtDefn: AdtDefn = {
116139
kind: AdtKind::Struct,
117140
},
118141
repr: AdtRepr {
119-
repr_c: repr.iter().any(|s| s == "C"),
120-
repr_packed: repr.iter().any(|s| s == "packed"),
142+
c: repr.iter().any(|s| s == &AdtReprAttr::C),
143+
packed: repr.iter().any(|s| s == &AdtReprAttr::Packed),
144+
int: None
121145
},
122146
}
123147
};
@@ -399,23 +423,35 @@ TyWithoutId: Ty = {
399423
ExistsLifetimes: Vec<Identifier> = "exists" "<" <Comma<LifetimeId>> ">" => <>;
400424
ForLifetimes: Vec<Identifier> = "for" "<" <Comma<LifetimeId>> ">" => <>;
401425

426+
IntTy: IntTy = {
427+
"i8" => IntTy::I8,
428+
"i16" => IntTy::I16,
429+
"i32" => IntTy::I32,
430+
"i64" => IntTy::I64,
431+
"i128" => IntTy::I128,
432+
"isize" => IntTy::Isize,
433+
};
434+
435+
UintTy: UintTy = {
436+
"u8" => UintTy::U8,
437+
"u16" => UintTy::U16,
438+
"u32" => UintTy::U32,
439+
"u64" => UintTy::U64,
440+
"u128" => UintTy::U128,
441+
"usize" => UintTy::Usize,
442+
};
443+
444+
FloatTy: FloatTy = {
445+
"f32" => FloatTy::F32,
446+
"f64" => FloatTy::F64,
447+
};
448+
402449
ScalarType: ScalarType = {
403-
"u8" => ScalarType::Uint(UintTy::U8),
404-
"u16" => ScalarType::Uint(UintTy::U16),
405-
"u32" => ScalarType::Uint(UintTy::U32),
406-
"u64" => ScalarType::Uint(UintTy::U64),
407-
"u128" => ScalarType::Uint(UintTy::U128),
408-
"usize" => ScalarType::Uint(UintTy::Usize),
409-
"i8" => ScalarType::Int(IntTy::I8),
410-
"i16" => ScalarType::Int(IntTy::I16),
411-
"i32" => ScalarType::Int(IntTy::I32),
412-
"i64" => ScalarType::Int(IntTy::I64),
413-
"i128" => ScalarType::Int(IntTy::I128),
414-
"isize" => ScalarType::Int(IntTy::Isize),
415-
"f32" => ScalarType::Float(FloatTy::F32),
416-
"f64" => ScalarType::Float(FloatTy::F64),
417-
"bool" => ScalarType::Bool,
418-
"char" => ScalarType::Char,
450+
<i:IntTy> => ScalarType::Int(i),
451+
<u:UintTy> => ScalarType::Uint(u),
452+
<f:FloatTy> => ScalarType::Float(f),
453+
"bool" => ScalarType::Bool,
454+
"char" => ScalarType::Char,
419455
};
420456

421457
TupleOrParensInner: Ty = {

chalk-solve/src/clauses/builtin_traits.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use chalk_ir::{Floundered, Substitution, Ty};
44

55
mod clone;
66
mod copy;
7+
mod discriminant_kind;
78
mod fn_family;
89
mod sized;
910
mod unsize;
@@ -69,6 +70,10 @@ pub fn add_builtin_assoc_program_clauses<I: Interner>(
6970
Ok(())
7071
})
7172
}
73+
WellKnownTrait::DiscriminantKind => {
74+
discriminant_kind::add_discriminant_clauses(db, builder, self_ty);
75+
Ok(())
76+
}
7277
_ => Ok(()),
7378
}
7479
}

0 commit comments

Comments
 (0)