@@ -10,6 +10,9 @@ use rustc_middle::traits::ChalkRustInterner as RustInterner;
10
10
use rustc_middle:: ty:: subst:: { InternalSubsts , Subst , SubstsRef } ;
11
11
use rustc_middle:: ty:: { self , AssocItemContainer , AssocKind , TyCtxt , TypeFoldable } ;
12
12
13
+ use rustc_ast:: ast;
14
+ use rustc_attr as attr;
15
+
13
16
use rustc_hir:: def_id:: DefId ;
14
17
15
18
use rustc_span:: symbol:: sym;
@@ -18,7 +21,6 @@ use std::fmt;
18
21
use std:: sync:: Arc ;
19
22
20
23
use crate :: chalk:: lowering:: { self , LowerInto } ;
21
- use rustc_ast:: ast;
22
24
23
25
pub struct RustIrDatabase < ' tcx > {
24
26
pub ( crate ) interner : RustInterner < ' tcx > ,
@@ -205,12 +207,32 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
205
207
fn adt_repr (
206
208
& self ,
207
209
adt_id : chalk_ir:: AdtId < RustInterner < ' tcx > > ,
208
- ) -> chalk_solve:: rust_ir:: AdtRepr {
210
+ ) -> Arc < chalk_solve:: rust_ir:: AdtRepr < RustInterner < ' tcx > > > {
209
211
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
+ } )
214
236
}
215
237
216
238
fn fn_def_datum (
@@ -316,7 +338,11 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
316
338
let self_ty = self_ty. fold_with ( & mut regions_substitutor) ;
317
339
let lowered_ty = self_ty. lower_into ( & self . interner ) ;
318
340
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
+ )
320
346
} ) ;
321
347
322
348
let impls = matched_impls. map ( chalk_ir:: ImplId ) . collect ( ) ;
@@ -541,6 +567,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
541
567
Unsize => lang_items. unsize_trait ( ) ,
542
568
Unpin => lang_items. unpin_trait ( ) ,
543
569
CoerceUnsized => lang_items. coerce_unsized_trait ( ) ,
570
+ DiscriminantKind => lang_items. discriminant_kind_trait ( ) ,
544
571
} ;
545
572
def_id. map ( chalk_ir:: TraitId )
546
573
}
@@ -586,7 +613,7 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
586
613
let sig = & substs. as_slice ( & self . interner ) [ substs. len ( & self . interner ) - 2 ] ;
587
614
match sig. assert_ty_ref ( & self . interner ) . kind ( & self . interner ) {
588
615
chalk_ir:: TyKind :: Function ( f) => {
589
- let substitution = f. substitution . as_slice ( & self . interner ) ;
616
+ let substitution = f. substitution . 0 . as_slice ( & self . interner ) ;
590
617
let return_type =
591
618
substitution. last ( ) . unwrap ( ) . assert_ty_ref ( & self . interner ) . clone ( ) ;
592
619
// Closure arguments are tupled
@@ -644,6 +671,51 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
644
671
) -> Arc < chalk_solve:: rust_ir:: GeneratorWitnessDatum < RustInterner < ' tcx > > > {
645
672
unimplemented ! ( )
646
673
}
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
+ }
647
719
}
648
720
649
721
/// Creates a `InternalSubsts` that maps each generic parameter to a higher-ranked
0 commit comments