@@ -481,54 +481,55 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
481481 is_cleanup : bool )
482482 -> Vec < BasicBlock >
483483 {
484- let mut succ = succ;
485484 let mut unwind_succ = if is_cleanup {
486485 None
487486 } else {
488487 c. unwind
489488 } ;
490- let mut update_drop_flag = true ;
489+
490+ let mut succ = self . new_block (
491+ c, c. is_cleanup , TerminatorKind :: Goto { target : succ }
492+ ) ;
493+
494+ // Always clear the "master" drop flag at the bottom of the
495+ // ladder. This is needed because the "master" drop flag
496+ // protects the ADT's discriminant, which is invalidated
497+ // after the ADT is dropped.
498+ self . set_drop_flag (
499+ Location { block : succ, statement_index : 0 } ,
500+ c. path ,
501+ DropFlagState :: Absent
502+ ) ;
491503
492504 fields. iter ( ) . rev ( ) . enumerate ( ) . map ( |( i, & ( ref lv, path) ) | {
493- let drop_block = match path {
494- Some ( path) => {
495- debug ! ( "drop_ladder: for std field {} ({:?})" , i, lv) ;
496-
497- self . elaborated_drop_block ( & DropCtxt {
498- source_info : c. source_info ,
499- is_cleanup : is_cleanup,
500- init_data : c. init_data ,
501- lvalue : lv,
502- path : path,
503- succ : succ,
504- unwind : unwind_succ,
505- } )
506- }
507- None => {
508- debug ! ( "drop_ladder: for rest field {} ({:?})" , i, lv) ;
509-
510- let blk = self . complete_drop ( & DropCtxt {
511- source_info : c. source_info ,
512- is_cleanup : is_cleanup,
513- init_data : c. init_data ,
514- lvalue : lv,
515- path : c. path ,
516- succ : succ,
517- unwind : unwind_succ,
518- } , update_drop_flag) ;
519-
520- // the drop flag has been updated - updating
521- // it again would clobber it.
522- update_drop_flag = false ;
523-
524- blk
525- }
505+ succ = if let Some ( path) = path {
506+ debug ! ( "drop_ladder: for std field {} ({:?})" , i, lv) ;
507+
508+ self . elaborated_drop_block ( & DropCtxt {
509+ source_info : c. source_info ,
510+ is_cleanup : is_cleanup,
511+ init_data : c. init_data ,
512+ lvalue : lv,
513+ path : path,
514+ succ : succ,
515+ unwind : unwind_succ,
516+ } )
517+ } else {
518+ debug ! ( "drop_ladder: for rest field {} ({:?})" , i, lv) ;
519+
520+ self . complete_drop ( & DropCtxt {
521+ source_info : c. source_info ,
522+ is_cleanup : is_cleanup,
523+ init_data : c. init_data ,
524+ lvalue : lv,
525+ path : c. path ,
526+ succ : succ,
527+ unwind : unwind_succ,
528+ } , false )
526529 } ;
527530
528- succ = drop_block;
529531 unwind_succ = unwind_ladder. as_ref ( ) . map ( |p| p[ i] ) ;
530-
531- drop_block
532+ succ
532533 } ) . collect ( )
533534 }
534535
0 commit comments