@@ -175,18 +175,18 @@ fn reg_component(cls: &[Class], i: &mut usize, size: Size) -> Option<Reg> {
175
175
}
176
176
}
177
177
178
- fn cast_target ( cls : & [ Class ] , size : Size ) -> CastTarget {
178
+ fn cast_target ( cls : & [ Class ] , size : Size ) -> Option < CastTarget > {
179
179
let mut i = 0 ;
180
- let lo = reg_component ( cls, & mut i, size) . unwrap ( ) ;
180
+ let lo = reg_component ( cls, & mut i, size) ? ;
181
181
let offset = Size :: from_bytes ( 8 ) * ( i as u64 ) ;
182
182
let target = if size <= offset {
183
183
CastTarget :: from ( lo)
184
184
} else {
185
- let hi = reg_component ( cls, & mut i, size - offset) . unwrap ( ) ;
185
+ let hi = reg_component ( cls, & mut i, size - offset) ? ;
186
186
CastTarget :: Pair ( lo, hi)
187
187
} ;
188
188
assert_eq ! ( reg_component( cls, & mut i, Size :: from_bytes( 0 ) ) , None ) ;
189
- target
189
+ Some ( target)
190
190
}
191
191
192
192
pub fn compute_abi_info < ' a , ' tcx > ( ccx : & CrateContext < ' a , ' tcx > , fty : & mut FnType < ' tcx > ) {
@@ -229,7 +229,12 @@ pub fn compute_abi_info<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, fty: &mut FnType
229
229
230
230
if arg. layout . is_aggregate ( ) {
231
231
let size = arg. layout . size ;
232
- arg. cast_to ( cast_target ( cls. as_ref ( ) . unwrap ( ) , size) )
232
+ let cls = cls. as_ref ( ) . unwrap ( ) ; // This cannot fail when `in_mem` is false.
233
+ if let Some ( target) = cast_target ( cls, size) {
234
+ arg. cast_to ( target) ;
235
+ } else {
236
+ bug ! ( "cast_target() failed: cls {:?} size {:?} arg {:?}" , cls, size, arg) ;
237
+ }
233
238
} else {
234
239
arg. extend_integer_width_to ( 32 ) ;
235
240
}
0 commit comments