@@ -10,6 +10,9 @@ use rustc_middle::traits::ChalkRustInterner as RustInterner;
1010use  rustc_middle:: ty:: subst:: { InternalSubsts ,  Subst ,  SubstsRef } ; 
1111use  rustc_middle:: ty:: { self ,  AssocItemContainer ,  AssocKind ,  TyCtxt ,  TypeFoldable } ; 
1212
13+ use  rustc_ast:: ast; 
14+ use  rustc_attr as  attr; 
15+ 
1316use  rustc_hir:: def_id:: DefId ; 
1417
1518use  rustc_span:: symbol:: sym; 
@@ -18,7 +21,6 @@ use std::fmt;
1821use  std:: sync:: Arc ; 
1922
2023use  crate :: chalk:: lowering:: { self ,  LowerInto } ; 
21- use  rustc_ast:: ast; 
2224
2325pub  struct  RustIrDatabase < ' tcx >  { 
2426    pub ( crate )  interner :  RustInterner < ' tcx > , 
@@ -205,12 +207,32 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
205207    fn  adt_repr ( 
206208        & self , 
207209        adt_id :  chalk_ir:: AdtId < RustInterner < ' tcx > > , 
208-     )  -> chalk_solve:: rust_ir:: AdtRepr  { 
210+     )  -> Arc < chalk_solve:: rust_ir:: AdtRepr < RustInterner < ' tcx > > >  { 
209211        let  adt_def = adt_id. 0 ; 
210-         chalk_solve:: rust_ir:: AdtRepr  { 
211-             repr_c :  adt_def. repr . c ( ) , 
212-             repr_packed :  adt_def. repr . packed ( ) , 
213-         } 
212+         let  int = |i| chalk_ir:: TyKind :: Scalar ( chalk_ir:: Scalar :: Int ( i) ) . intern ( & self . interner ) ; 
213+         let  uint = |i| chalk_ir:: TyKind :: Scalar ( chalk_ir:: Scalar :: Uint ( i) ) . intern ( & self . interner ) ; 
214+         Arc :: new ( chalk_solve:: rust_ir:: AdtRepr  { 
215+             c :  adt_def. repr . c ( ) , 
216+             packed :  adt_def. repr . packed ( ) , 
217+             int :  adt_def. repr . int . map ( |i| match  i { 
218+                 attr:: IntType :: SignedInt ( ty)  => match  ty { 
219+                     ast:: IntTy :: Isize  => int ( chalk_ir:: IntTy :: Isize ) , 
220+                     ast:: IntTy :: I8  => int ( chalk_ir:: IntTy :: I8 ) , 
221+                     ast:: IntTy :: I16  => int ( chalk_ir:: IntTy :: I16 ) , 
222+                     ast:: IntTy :: I32  => int ( chalk_ir:: IntTy :: I32 ) , 
223+                     ast:: IntTy :: I64  => int ( chalk_ir:: IntTy :: I64 ) , 
224+                     ast:: IntTy :: I128  => int ( chalk_ir:: IntTy :: I128 ) , 
225+                 } , 
226+                 attr:: IntType :: UnsignedInt ( ty)  => match  ty { 
227+                     ast:: UintTy :: Usize  => uint ( chalk_ir:: UintTy :: Usize ) , 
228+                     ast:: UintTy :: U8  => uint ( chalk_ir:: UintTy :: U8 ) , 
229+                     ast:: UintTy :: U16  => uint ( chalk_ir:: UintTy :: U16 ) , 
230+                     ast:: UintTy :: U32  => uint ( chalk_ir:: UintTy :: U32 ) , 
231+                     ast:: UintTy :: U64  => uint ( chalk_ir:: UintTy :: U64 ) , 
232+                     ast:: UintTy :: U128  => uint ( chalk_ir:: UintTy :: U128 ) , 
233+                 } , 
234+             } ) , 
235+         } ) 
214236    } 
215237
216238    fn  fn_def_datum ( 
@@ -316,7 +338,11 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
316338            let  self_ty = self_ty. fold_with ( & mut  regions_substitutor) ; 
317339            let  lowered_ty = self_ty. lower_into ( & self . interner ) ; 
318340
319-             parameters[ 0 ] . assert_ty_ref ( & self . interner ) . could_match ( & self . interner ,  & lowered_ty) 
341+             parameters[ 0 ] . assert_ty_ref ( & self . interner ) . could_match ( 
342+                 & self . interner , 
343+                 self . unification_database ( ) , 
344+                 & lowered_ty, 
345+             ) 
320346        } ) ; 
321347
322348        let  impls = matched_impls. map ( chalk_ir:: ImplId ) . collect ( ) ; 
@@ -541,6 +567,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
541567            Unsize  => lang_items. unsize_trait ( ) , 
542568            Unpin  => lang_items. unpin_trait ( ) , 
543569            CoerceUnsized  => lang_items. coerce_unsized_trait ( ) , 
570+             DiscriminantKind  => lang_items. discriminant_kind_trait ( ) , 
544571        } ; 
545572        def_id. map ( chalk_ir:: TraitId ) 
546573    } 
@@ -586,7 +613,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
586613        let  sig = & substs. as_slice ( & self . interner ) [ substs. len ( & self . interner )  - 2 ] ; 
587614        match  sig. assert_ty_ref ( & self . interner ) . kind ( & self . interner )  { 
588615            chalk_ir:: TyKind :: Function ( f)  => { 
589-                 let  substitution = f. substitution . as_slice ( & self . interner ) ; 
616+                 let  substitution = f. substitution . 0 . as_slice ( & self . interner ) ; 
590617                let  return_type =
591618                    substitution. last ( ) . unwrap ( ) . assert_ty_ref ( & self . interner ) . clone ( ) ; 
592619                // Closure arguments are tupled 
@@ -644,6 +671,51 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
644671    )  -> Arc < chalk_solve:: rust_ir:: GeneratorWitnessDatum < RustInterner < ' tcx > > >  { 
645672        unimplemented ! ( ) 
646673    } 
674+ 
675+     fn  unification_database ( & self )  -> & dyn  chalk_ir:: UnificationDatabase < RustInterner < ' tcx > >  { 
676+         self 
677+     } 
678+ 
679+     fn  discriminant_type ( 
680+         & self , 
681+         _:  chalk_ir:: Ty < RustInterner < ' tcx > > , 
682+     )  -> chalk_ir:: Ty < RustInterner < ' tcx > >  { 
683+         unimplemented ! ( ) 
684+     } 
685+ } 
686+ 
687+ impl < ' tcx >  chalk_ir:: UnificationDatabase < RustInterner < ' tcx > >  for  RustIrDatabase < ' tcx >  { 
688+     fn  fn_def_variance ( 
689+         & self , 
690+         def_id :  chalk_ir:: FnDefId < RustInterner < ' tcx > > , 
691+     )  -> chalk_ir:: Variances < RustInterner < ' tcx > >  { 
692+         let  variances = self . interner . tcx . variances_of ( def_id. 0 ) ; 
693+         chalk_ir:: Variances :: from_iter ( 
694+             & self . interner , 
695+             variances. iter ( ) . map ( |v| match  v { 
696+                 ty:: Variance :: Invariant  => chalk_ir:: Variance :: Invariant , 
697+                 ty:: Variance :: Covariant  => chalk_ir:: Variance :: Covariant , 
698+                 ty:: Variance :: Contravariant  => chalk_ir:: Variance :: Contravariant , 
699+                 ty:: Variance :: Bivariant  => unimplemented ! ( ) , 
700+             } ) , 
701+         ) 
702+     } 
703+ 
704+     fn  adt_variance ( 
705+         & self , 
706+         def_id :  chalk_ir:: AdtId < RustInterner < ' tcx > > , 
707+     )  -> chalk_ir:: Variances < RustInterner < ' tcx > >  { 
708+         let  variances = self . interner . tcx . variances_of ( def_id. 0 . did ) ; 
709+         chalk_ir:: Variances :: from_iter ( 
710+             & self . interner , 
711+             variances. iter ( ) . map ( |v| match  v { 
712+                 ty:: Variance :: Invariant  => chalk_ir:: Variance :: Invariant , 
713+                 ty:: Variance :: Covariant  => chalk_ir:: Variance :: Covariant , 
714+                 ty:: Variance :: Contravariant  => chalk_ir:: Variance :: Contravariant , 
715+                 ty:: Variance :: Bivariant  => unimplemented ! ( ) , 
716+             } ) , 
717+         ) 
718+     } 
647719} 
648720
649721/// Creates a `InternalSubsts` that maps each generic parameter to a higher-ranked 
0 commit comments