@@ -17,6 +17,7 @@ use abi::FnType;
17
17
use adt;
18
18
use common:: * ;
19
19
use machine;
20
+ use rustc:: traits:: ProjectionMode ;
20
21
use rustc:: ty:: { self , Ty , TypeFoldable } ;
21
22
22
23
use type_:: Type ;
@@ -121,6 +122,37 @@ pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Typ
121
122
debug ! ( "--> mapped t={:?} to llsizingty={:?}" , t, llsizingty) ;
122
123
123
124
cx. llsizingtypes ( ) . borrow_mut ( ) . insert ( t, llsizingty) ;
125
+
126
+ // FIXME(eddyb) Temporary sanity check for ty::layout.
127
+ let infcx = infer:: normalizing_infer_ctxt ( cx. tcx ( ) , & cx. tcx ( ) . tables , ProjectionMode :: Any ) ;
128
+ match t. layout ( & infcx) {
129
+ Ok ( layout) => {
130
+ if !type_is_sized ( cx. tcx ( ) , t) {
131
+ if !layout. is_unsized ( ) {
132
+ bug ! ( "layout should be unsized for type `{}` / {:#?}" ,
133
+ t, layout) ;
134
+ }
135
+
136
+ // Unsized types get turned into a fat pointer for LLVM.
137
+ return llsizingty;
138
+ }
139
+ let r = layout. size ( & cx. tcx ( ) . data_layout ) . bytes ( ) ;
140
+ let l = machine:: llsize_of_alloc ( cx, llsizingty) ;
141
+ if r != l {
142
+ bug ! ( "size differs (rustc: {}, llvm: {}) for type `{}` / {:#?}" ,
143
+ r, l, t, layout) ;
144
+ }
145
+ let r = layout. align ( & cx. tcx ( ) . data_layout ) . abi ( ) ;
146
+ let l = machine:: llalign_of_min ( cx, llsizingty) as u64 ;
147
+ if r != l {
148
+ bug ! ( "align differs (rustc: {}, llvm: {}) for type `{}` / {:#?}" ,
149
+ r, l, t, layout) ;
150
+ }
151
+ }
152
+ Err ( e) => {
153
+ bug ! ( "failed to get layout for `{}`: {}" , t, e) ;
154
+ }
155
+ }
124
156
llsizingty
125
157
}
126
158
0 commit comments