@@ -100,7 +100,7 @@ impl<'tcx> CValue<'tcx> {
100
100
CValueInner :: ByVal ( _) | CValueInner :: ByValPair ( _, _) => {
101
101
let cplace = CPlace :: new_stack_slot ( fx, layout) ;
102
102
cplace. write_cvalue ( fx, self ) ;
103
- ( cplace. to_ptr ( fx ) , None )
103
+ ( cplace. to_ptr ( ) , None )
104
104
}
105
105
}
106
106
}
@@ -259,7 +259,6 @@ pub(crate) struct CPlace<'tcx> {
259
259
pub ( crate ) enum CPlaceInner {
260
260
Var ( Local ) ,
261
261
Addr ( Pointer , Option < Value > ) ,
262
- NoPlace ,
263
262
}
264
263
265
264
impl < ' tcx > CPlace < ' tcx > {
@@ -273,7 +272,7 @@ impl<'tcx> CPlace<'tcx> {
273
272
274
273
pub ( crate ) fn no_place ( layout : TyAndLayout < ' tcx > ) -> CPlace < ' tcx > {
275
274
CPlace {
276
- inner : CPlaceInner :: NoPlace ,
275
+ inner : CPlaceInner :: Addr ( Pointer :: dangling ( layout . align . pref ) , None ) ,
277
276
layout,
278
277
}
279
278
}
@@ -284,10 +283,7 @@ impl<'tcx> CPlace<'tcx> {
284
283
) -> CPlace < ' tcx > {
285
284
assert ! ( !layout. is_unsized( ) ) ;
286
285
if layout. size . bytes ( ) == 0 {
287
- return CPlace {
288
- inner : CPlaceInner :: NoPlace ,
289
- layout,
290
- } ;
286
+ return CPlace :: no_place ( layout) ;
291
287
}
292
288
293
289
let stack_slot = fx. bcx . create_stack_slot ( StackSlotData {
@@ -343,33 +339,20 @@ impl<'tcx> CPlace<'tcx> {
343
339
CValue :: by_ref ( ptr, layout)
344
340
}
345
341
}
346
- CPlaceInner :: NoPlace => CValue :: by_ref (
347
- Pointer :: dangling ( self . layout . align . pref ) ,
348
- layout,
349
- ) ,
350
342
}
351
343
}
352
344
353
- pub ( crate ) fn to_ptr ( self , fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > ) -> Pointer {
354
- match self . to_ptr_maybe_unsized ( fx ) {
345
+ pub ( crate ) fn to_ptr ( self ) -> Pointer {
346
+ match self . to_ptr_maybe_unsized ( ) {
355
347
( ptr, None ) => ptr,
356
348
( _, Some ( _) ) => bug ! ( "Expected sized cplace, found {:?}" , self ) ,
357
349
}
358
350
}
359
351
360
- pub ( crate ) fn to_ptr_maybe_unsized (
361
- self ,
362
- fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > ,
363
- ) -> ( Pointer , Option < Value > ) {
352
+ pub ( crate ) fn to_ptr_maybe_unsized ( self ) -> ( Pointer , Option < Value > ) {
364
353
match self . inner {
365
354
CPlaceInner :: Addr ( ptr, extra) => ( ptr, extra) ,
366
- CPlaceInner :: NoPlace => {
367
- (
368
- Pointer :: const_addr ( fx, i64:: try_from ( self . layout . align . pref . bytes ( ) ) . unwrap ( ) ) ,
369
- None ,
370
- )
371
- }
372
- CPlaceInner :: Var ( _) => bug ! ( "Expected CPlace::Addr, found CPlace::Var" ) ,
355
+ CPlaceInner :: Var ( _) => bug ! ( "Expected CPlace::Addr, found {:?}" , self ) ,
373
356
}
374
357
}
375
358
@@ -460,12 +443,11 @@ impl<'tcx> CPlace<'tcx> {
460
443
fx. bcx . def_var ( mir_var ( var) , data) ;
461
444
return ;
462
445
}
463
- CPlaceInner :: Addr ( ptr, None ) => ptr,
464
- CPlaceInner :: NoPlace => {
465
- if dst_layout. abi != Abi :: Uninhabited {
466
- assert_eq ! ( dst_layout. size. bytes( ) , 0 , "{:?}" , dst_layout) ;
446
+ CPlaceInner :: Addr ( ptr, None ) => {
447
+ if dst_layout. size == Size :: ZERO || dst_layout. abi == Abi :: Uninhabited {
448
+ return ;
467
449
}
468
- return ;
450
+ ptr
469
451
}
470
452
CPlaceInner :: Addr ( _, Some ( _) ) => bug ! ( "Can't write value to unsized place {:?}" , self ) ,
471
453
} ;
@@ -524,7 +506,7 @@ impl<'tcx> CPlace<'tcx> {
524
506
field : mir:: Field ,
525
507
) -> CPlace < ' tcx > {
526
508
let layout = self . layout ( ) ;
527
- let ( base, extra) = self . to_ptr_maybe_unsized ( fx ) ;
509
+ let ( base, extra) = self . to_ptr_maybe_unsized ( ) ;
528
510
529
511
let ( field_ptr, field_layout) = codegen_field ( fx, base, extra, layout, field) ;
530
512
if field_layout. is_unsized ( ) {
@@ -540,8 +522,8 @@ impl<'tcx> CPlace<'tcx> {
540
522
index : Value ,
541
523
) -> CPlace < ' tcx > {
542
524
let ( elem_layout, ptr) = match self . layout ( ) . ty . kind {
543
- ty:: Array ( elem_ty, _) => ( fx. layout_of ( elem_ty) , self . to_ptr ( fx ) ) ,
544
- ty:: Slice ( elem_ty) => ( fx. layout_of ( elem_ty) , self . to_ptr_maybe_unsized ( fx ) . 0 ) ,
525
+ ty:: Array ( elem_ty, _) => ( fx. layout_of ( elem_ty) , self . to_ptr ( ) ) ,
526
+ ty:: Slice ( elem_ty) => ( fx. layout_of ( elem_ty) , self . to_ptr_maybe_unsized ( ) . 0 ) ,
545
527
_ => bug ! ( "place_index({:?})" , self . layout( ) . ty) ,
546
528
} ;
547
529
@@ -565,27 +547,21 @@ impl<'tcx> CPlace<'tcx> {
565
547
566
548
pub ( crate ) fn write_place_ref ( self , fx : & mut FunctionCx < ' _ , ' tcx , impl Backend > , dest : CPlace < ' tcx > ) {
567
549
if has_ptr_meta ( fx. tcx , self . layout ( ) . ty ) {
568
- let ( ptr, extra) = self . to_ptr_maybe_unsized ( fx ) ;
550
+ let ( ptr, extra) = self . to_ptr_maybe_unsized ( ) ;
569
551
let ptr = CValue :: by_val_pair (
570
552
ptr. get_addr ( fx) ,
571
553
extra. expect ( "unsized type without metadata" ) ,
572
554
dest. layout ( ) ,
573
555
) ;
574
556
dest. write_cvalue ( fx, ptr) ;
575
557
} else {
576
- let ptr = CValue :: by_val ( self . to_ptr ( fx ) . get_addr ( fx) , dest. layout ( ) ) ;
558
+ let ptr = CValue :: by_val ( self . to_ptr ( ) . get_addr ( fx) , dest. layout ( ) ) ;
577
559
dest. write_cvalue ( fx, ptr) ;
578
560
}
579
561
}
580
562
581
563
pub ( crate ) fn unchecked_cast_to ( self , layout : TyAndLayout < ' tcx > ) -> Self {
582
564
assert ! ( !self . layout( ) . is_unsized( ) ) ;
583
- match self . inner {
584
- CPlaceInner :: NoPlace => {
585
- assert ! ( layout. size. bytes( ) == 0 ) ;
586
- }
587
- _ => { }
588
- }
589
565
CPlace {
590
566
inner : self . inner ,
591
567
layout,
0 commit comments