@@ -100,6 +100,8 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
100
100
&self,
101
101
trait_id: chalk_ir::TraitId<RustInterner<'tcx>>,
102
102
) -> Arc<chalk_solve::rust_ir::TraitDatum<RustInterner<'tcx>>> {
103
+ use chalk_solve::rust_ir::WellKnownTrait::*;
104
+
103
105
let def_id = trait_id.0;
104
106
let trait_def = self.interner.tcx.trait_def(def_id);
105
107
@@ -119,25 +121,27 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
119
121
120
122
let lang_items = self.interner.tcx.lang_items();
121
123
let well_known = if lang_items.sized_trait() == Some(def_id) {
122
- Some(chalk_solve::rust_ir::WellKnownTrait:: Sized)
124
+ Some(Sized)
123
125
} else if lang_items.copy_trait() == Some(def_id) {
124
- Some(chalk_solve::rust_ir::WellKnownTrait:: Copy)
126
+ Some(Copy)
125
127
} else if lang_items.clone_trait() == Some(def_id) {
126
- Some(chalk_solve::rust_ir::WellKnownTrait:: Clone)
128
+ Some(Clone)
127
129
} else if lang_items.drop_trait() == Some(def_id) {
128
- Some(chalk_solve::rust_ir::WellKnownTrait:: Drop)
130
+ Some(Drop)
129
131
} else if lang_items.fn_trait() == Some(def_id) {
130
- Some(chalk_solve::rust_ir::WellKnownTrait:: Fn)
132
+ Some(Fn)
131
133
} else if lang_items.fn_once_trait() == Some(def_id) {
132
- Some(chalk_solve::rust_ir::WellKnownTrait:: FnOnce)
134
+ Some(FnOnce)
133
135
} else if lang_items.fn_mut_trait() == Some(def_id) {
134
- Some(chalk_solve::rust_ir::WellKnownTrait:: FnMut)
136
+ Some(FnMut)
135
137
} else if lang_items.unsize_trait() == Some(def_id) {
136
- Some(chalk_solve::rust_ir::WellKnownTrait:: Unsize)
138
+ Some(Unsize)
137
139
} else if lang_items.unpin_trait() == Some(def_id) {
138
- Some(chalk_solve::rust_ir::WellKnownTrait:: Unpin)
140
+ Some(Unpin)
139
141
} else if lang_items.coerce_unsized_trait() == Some(def_id) {
140
- Some(chalk_solve::rust_ir::WellKnownTrait::CoerceUnsized)
142
+ Some(CoerceUnsized)
143
+ } else if lang_items.dispatch_from_dyn_trait() == Some(def_id) {
144
+ Some(DispatchFromDyn)
141
145
} else {
142
146
None
143
147
};
@@ -232,6 +236,28 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
232
236
})
233
237
}
234
238
239
+ fn adt_size_align(
240
+ &self,
241
+ adt_id: chalk_ir::AdtId<RustInterner<'tcx>>,
242
+ ) -> Arc<chalk_solve::rust_ir::AdtSizeAlign> {
243
+ let tcx = self.interner.tcx;
244
+ let did = adt_id.0.did();
245
+
246
+ // Grab the ADT and the param we might need to calculate its layout
247
+ let param_env = tcx.param_env(did);
248
+ let adt_ty = tcx.type_of(did);
249
+
250
+ // The ADT is a 1-zst if it's a ZST and its alignment is 1.
251
+ // Mark the ADT as _not_ a 1-zst if there was a layout error.
252
+ let one_zst = if let Ok(layout) = tcx.layout_of(param_env.and(adt_ty)) {
253
+ layout.is_zst() && layout.align.abi.bytes() == 1
254
+ } else {
255
+ false
256
+ };
257
+
258
+ Arc::new(chalk_solve::rust_ir::AdtSizeAlign::from_one_zst(one_zst))
259
+ }
260
+
235
261
fn fn_def_datum(
236
262
&self,
237
263
fn_def_id: chalk_ir::FnDefId<RustInterner<'tcx>>,
@@ -540,6 +566,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
540
566
Unpin => lang_items.unpin_trait(),
541
567
CoerceUnsized => lang_items.coerce_unsized_trait(),
542
568
DiscriminantKind => lang_items.discriminant_kind_trait(),
569
+ DispatchFromDyn => lang_items.dispatch_from_dyn_trait(),
543
570
};
544
571
def_id.map(chalk_ir::TraitId)
545
572
}
0 commit comments