@@ -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