@@ -928,21 +928,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
928
928
// we get a value of a built-in pointer type.
929
929
//
930
930
// This is also relevant for `Pin<&mut Self>`, where we need to peel the `Pin`.
931
- ' descend_newtypes: while !op. layout . ty . is_unsafe_ptr ( )
932
- && !op. layout . ty . is_ref ( )
933
- {
934
- for i in 0 ..op. layout . fields . count ( ) {
935
- let field = op. extract_field ( bx, i) ;
936
- if !field. layout . is_1zst ( ) {
937
- // we found the one non-1-ZST field that is allowed
938
- // now find *its* non-zero-sized field, or stop if it's a
939
- // pointer
940
- op = field;
941
- continue ' descend_newtypes;
942
- }
943
- }
944
-
945
- span_bug ! ( span, "receiver has no non-zero-sized fields {:?}" , op) ;
931
+ while !op. layout . ty . is_unsafe_ptr ( ) && !op. layout . ty . is_ref ( ) {
932
+ let ( idx, _) = op. layout . non_1zst_field ( bx) . expect (
933
+ "not exactly one non-1-ZST field in a `DispatchFromDyn` type" ,
934
+ ) ;
935
+ op = op. extract_field ( bx, idx) ;
946
936
}
947
937
948
938
// now that we have `*dyn Trait` or `&dyn Trait`, split it up into its
@@ -970,22 +960,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
970
960
}
971
961
Immediate ( _) => {
972
962
// See comment above explaining why we peel these newtypes
973
- ' descend_newtypes: while !op. layout . ty . is_unsafe_ptr ( )
974
- && !op. layout . ty . is_ref ( )
975
- {
976
- for i in 0 ..op. layout . fields . count ( ) {
977
- let field = op. extract_field ( bx, i) ;
978
- if !field. layout . is_1zst ( ) {
979
- // We found the one non-1-ZST field that is allowed. (The rules
980
- // for `DispatchFromDyn` ensure there's exactly one such field.)
981
- // Now find *its* non-zero-sized field, or stop if it's a
982
- // pointer.
983
- op = field;
984
- continue ' descend_newtypes;
985
- }
986
- }
987
-
988
- span_bug ! ( span, "receiver has no non-zero-sized fields {:?}" , op) ;
963
+ while !op. layout . ty . is_unsafe_ptr ( ) && !op. layout . ty . is_ref ( ) {
964
+ let ( idx, _) = op. layout . non_1zst_field ( bx) . expect (
965
+ "not exactly one non-1-ZST field in a `DispatchFromDyn` type" ,
966
+ ) ;
967
+ op = op. extract_field ( bx, idx) ;
989
968
}
990
969
991
970
// Make sure that we've actually unwrapped the rcvr down
0 commit comments