@@ -100,6 +100,8 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
100100 & self ,
101101 trait_id : chalk_ir:: TraitId < RustInterner < ' tcx > > ,
102102 ) -> Arc < chalk_solve:: rust_ir:: TraitDatum < RustInterner < ' tcx > > > {
103+ use chalk_solve:: rust_ir:: WellKnownTrait :: * ;
104+
103105 let def_id = trait_id. 0 ;
104106 let trait_def = self . interner . tcx . trait_def ( def_id) ;
105107
@@ -119,25 +121,27 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
119121
120122 let lang_items = self . interner . tcx . lang_items ( ) ;
121123 let well_known = if lang_items. sized_trait ( ) == Some ( def_id) {
122- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Sized )
124+ Some ( Sized )
123125 } else if lang_items. copy_trait ( ) == Some ( def_id) {
124- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Copy )
126+ Some ( Copy )
125127 } else if lang_items. clone_trait ( ) == Some ( def_id) {
126- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Clone )
128+ Some ( Clone )
127129 } else if lang_items. drop_trait ( ) == Some ( def_id) {
128- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Drop )
130+ Some ( Drop )
129131 } else if lang_items. fn_trait ( ) == Some ( def_id) {
130- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Fn )
132+ Some ( Fn )
131133 } else if lang_items. fn_once_trait ( ) == Some ( def_id) {
132- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: FnOnce )
134+ Some ( FnOnce )
133135 } else if lang_items. fn_mut_trait ( ) == Some ( def_id) {
134- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: FnMut )
136+ Some ( FnMut )
135137 } else if lang_items. unsize_trait ( ) == Some ( def_id) {
136- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Unsize )
138+ Some ( Unsize )
137139 } else if lang_items. unpin_trait ( ) == Some ( def_id) {
138- Some ( chalk_solve :: rust_ir :: WellKnownTrait :: Unpin )
140+ Some ( Unpin )
139141 } 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 )
141145 } else {
142146 None
143147 } ;
@@ -232,6 +236,28 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
232236 } )
233237 }
234238
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+
235261 fn fn_def_datum (
236262 & self ,
237263 fn_def_id : chalk_ir:: FnDefId < RustInterner < ' tcx > > ,
@@ -540,6 +566,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
540566 Unpin => lang_items. unpin_trait ( ) ,
541567 CoerceUnsized => lang_items. coerce_unsized_trait ( ) ,
542568 DiscriminantKind => lang_items. discriminant_kind_trait ( ) ,
569+ DispatchFromDyn => lang_items. dispatch_from_dyn_trait ( ) ,
543570 } ;
544571 def_id. map ( chalk_ir:: TraitId )
545572 }
0 commit comments