22
33use std:: sync:: Arc ;
44
5+ use base_db:: CrateId ;
56use chalk_ir:: { AdtId , TyKind } ;
67use hir_def:: {
78 layout:: {
@@ -17,7 +18,7 @@ use crate::{db::HirDatabase, Interner, Substitution, Ty};
1718use self :: adt:: struct_variant_idx;
1819pub use self :: {
1920 adt:: { layout_of_adt_query, layout_of_adt_recover} ,
20- target:: current_target_data_layout_query ,
21+ target:: target_data_layout_query ,
2122} ;
2223
2324macro_rules! user_error {
@@ -31,6 +32,7 @@ mod target;
3132
3233struct LayoutCx < ' a > {
3334 db : & ' a dyn HirDatabase ,
35+ krate : CrateId ,
3436}
3537
3638impl LayoutCalculator for LayoutCx < ' _ > {
@@ -41,7 +43,7 @@ impl LayoutCalculator for LayoutCx<'_> {
4143 }
4244
4345 fn current_data_layout ( & self ) -> Arc < TargetDataLayout > {
44- self . db . current_target_data_layout ( )
46+ self . db . target_data_layout ( self . krate )
4547 }
4648}
4749
@@ -53,9 +55,9 @@ fn scalar(dl: &TargetDataLayout, value: Primitive) -> Layout {
5355 Layout :: scalar ( dl, scalar_unit ( dl, value) )
5456}
5557
56- pub fn layout_of_ty ( db : & dyn HirDatabase , ty : & Ty ) -> Result < Layout , LayoutError > {
57- let dl = & * db . current_target_data_layout ( ) ;
58- let cx = LayoutCx { db } ;
58+ pub fn layout_of_ty ( db : & dyn HirDatabase , ty : & Ty , krate : CrateId ) -> Result < Layout , LayoutError > {
59+ let cx = LayoutCx { db , krate } ;
60+ let dl = & * cx . current_data_layout ( ) ;
5961 Ok ( match ty. kind ( Interner ) {
6062 TyKind :: Adt ( AdtId ( def) , subst) => db. layout_of_adt ( * def, subst. clone ( ) ) ?,
6163 TyKind :: Scalar ( s) => match s {
@@ -84,7 +86,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
8486 chalk_ir:: IntTy :: I64 => Integer :: I64 ,
8587 chalk_ir:: IntTy :: I128 => Integer :: I128 ,
8688 } ,
87- false ,
89+ true ,
8890 ) ,
8991 ) ,
9092 chalk_ir:: Scalar :: Uint ( i) => scalar (
@@ -98,7 +100,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
98100 chalk_ir:: UintTy :: U64 => Integer :: I64 ,
99101 chalk_ir:: UintTy :: U128 => Integer :: I128 ,
100102 } ,
101- true ,
103+ false ,
102104 ) ,
103105 ) ,
104106 chalk_ir:: Scalar :: Float ( f) => scalar (
@@ -114,7 +116,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
114116
115117 let fields = tys
116118 . iter ( Interner )
117- . map ( |k| layout_of_ty ( db, k. assert_ty_ref ( Interner ) ) )
119+ . map ( |k| layout_of_ty ( db, k. assert_ty_ref ( Interner ) , krate ) )
118120 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
119121 let fields = fields. iter ( ) . collect :: < Vec < _ > > ( ) ;
120122 let fields = fields. iter ( ) . collect :: < Vec < _ > > ( ) ;
@@ -132,7 +134,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
132134 } ,
133135 _ => return Err ( LayoutError :: HasPlaceholder ) ,
134136 } ;
135- let element = layout_of_ty ( db, element) ?;
137+ let element = layout_of_ty ( db, element, krate ) ?;
136138 let size = element. size . checked_mul ( count, dl) . ok_or ( LayoutError :: SizeOverflow ) ?;
137139
138140 let abi = if count != 0 && matches ! ( element. abi, Abi :: Uninhabited ) {
@@ -153,7 +155,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
153155 }
154156 }
155157 TyKind :: Slice ( element) => {
156- let element = layout_of_ty ( db, element) ?;
158+ let element = layout_of_ty ( db, element, krate ) ?;
157159 Layout {
158160 variants : Variants :: Single { index : struct_variant_idx ( ) } ,
159161 fields : FieldsShape :: Array { stride : element. size , count : 0 } ,
0 commit comments