2
2
3
3
use std:: sync:: Arc ;
4
4
5
+ use base_db:: CrateId ;
5
6
use chalk_ir:: { AdtId , TyKind } ;
6
7
use hir_def:: {
7
8
layout:: {
@@ -17,7 +18,7 @@ use crate::{db::HirDatabase, Interner, Substitution, Ty};
17
18
use self :: adt:: struct_variant_idx;
18
19
pub use self :: {
19
20
adt:: { layout_of_adt_query, layout_of_adt_recover} ,
20
- target:: current_target_data_layout_query ,
21
+ target:: target_data_layout_query ,
21
22
} ;
22
23
23
24
macro_rules! user_error {
@@ -31,6 +32,7 @@ mod target;
31
32
32
33
struct LayoutCx < ' a > {
33
34
db : & ' a dyn HirDatabase ,
35
+ krate : CrateId ,
34
36
}
35
37
36
38
impl LayoutCalculator for LayoutCx < ' _ > {
@@ -41,7 +43,7 @@ impl LayoutCalculator for LayoutCx<'_> {
41
43
}
42
44
43
45
fn current_data_layout ( & self ) -> Arc < TargetDataLayout > {
44
- self . db . current_target_data_layout ( )
46
+ self . db . target_data_layout ( self . krate )
45
47
}
46
48
}
47
49
@@ -53,9 +55,9 @@ fn scalar(dl: &TargetDataLayout, value: Primitive) -> Layout {
53
55
Layout :: scalar ( dl, scalar_unit ( dl, value) )
54
56
}
55
57
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 ( ) ;
59
61
Ok ( match ty. kind ( Interner ) {
60
62
TyKind :: Adt ( AdtId ( def) , subst) => db. layout_of_adt ( * def, subst. clone ( ) ) ?,
61
63
TyKind :: Scalar ( s) => match s {
@@ -84,7 +86,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
84
86
chalk_ir:: IntTy :: I64 => Integer :: I64 ,
85
87
chalk_ir:: IntTy :: I128 => Integer :: I128 ,
86
88
} ,
87
- false ,
89
+ true ,
88
90
) ,
89
91
) ,
90
92
chalk_ir:: Scalar :: Uint ( i) => scalar (
@@ -98,7 +100,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
98
100
chalk_ir:: UintTy :: U64 => Integer :: I64 ,
99
101
chalk_ir:: UintTy :: U128 => Integer :: I128 ,
100
102
} ,
101
- true ,
103
+ false ,
102
104
) ,
103
105
) ,
104
106
chalk_ir:: Scalar :: Float ( f) => scalar (
@@ -114,7 +116,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
114
116
115
117
let fields = tys
116
118
. 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 ) )
118
120
. collect :: < Result < Vec < _ > , _ > > ( ) ?;
119
121
let fields = fields. iter ( ) . collect :: < Vec < _ > > ( ) ;
120
122
let fields = fields. iter ( ) . collect :: < Vec < _ > > ( ) ;
@@ -132,7 +134,7 @@ pub fn layout_of_ty(db: &dyn HirDatabase, ty: &Ty) -> Result<Layout, LayoutError
132
134
} ,
133
135
_ => return Err ( LayoutError :: HasPlaceholder ) ,
134
136
} ;
135
- let element = layout_of_ty ( db, element) ?;
137
+ let element = layout_of_ty ( db, element, krate ) ?;
136
138
let size = element. size . checked_mul ( count, dl) . ok_or ( LayoutError :: SizeOverflow ) ?;
137
139
138
140
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
153
155
}
154
156
}
155
157
TyKind :: Slice ( element) => {
156
- let element = layout_of_ty ( db, element) ?;
158
+ let element = layout_of_ty ( db, element, krate ) ?;
157
159
Layout {
158
160
variants : Variants :: Single { index : struct_variant_idx ( ) } ,
159
161
fields : FieldsShape :: Array { stride : element. size , count : 0 } ,
0 commit comments