1
+ #![ allow( unused) ]
1
2
use std:: fmt:: Debug ;
2
3
use std:: iter;
3
4
@@ -31,6 +32,7 @@ use crate::errors::{
31
32
MultipleArrayFieldsSimdType , NonPrimitiveSimdType , OversizedSimdType , ZeroLengthSimdType ,
32
33
} ;
33
34
35
+ mod coroutine;
34
36
mod invariant;
35
37
36
38
pub ( crate ) fn provide ( providers : & mut Providers ) {
@@ -397,7 +399,13 @@ fn layout_of_uncached<'tcx>(
397
399
tcx. mk_layout ( unit)
398
400
}
399
401
400
- ty:: Coroutine ( def_id, args) => coroutine_layout ( cx, ty, def_id, args) ?,
402
+ ty:: Coroutine ( def_id, args) => {
403
+ // if tcx.features().coroutine_new_layout() {
404
+ coroutine:: coroutine_layout ( cx, ty, def_id, args) ?
405
+ // } else {
406
+ // coroutine_layout(cx, ty, def_id, args)?
407
+ // }
408
+ }
401
409
402
410
ty:: Closure ( _, args) => {
403
411
let tys = args. as_closure ( ) . upvar_tys ( ) ;
@@ -1168,8 +1176,10 @@ fn variant_info_for_coroutine<'tcx>(
1168
1176
. zip_eq ( upvar_names)
1169
1177
. enumerate ( )
1170
1178
. map ( |( field_idx, ( _, name) ) | {
1171
- let field_layout = layout. field ( cx, field_idx) ;
1172
- let offset = layout. fields . offset ( field_idx) ;
1179
+ // Upvars occupies the Unresumed variant at index zero
1180
+ let variant_layout = layout. for_variant ( cx, VariantIdx :: ZERO ) ;
1181
+ let field_layout = variant_layout. field ( cx, field_idx) ;
1182
+ let offset = variant_layout. fields . offset ( field_idx) ;
1173
1183
upvars_size = upvars_size. max ( offset + field_layout. size ) ;
1174
1184
FieldInfo {
1175
1185
kind : FieldKind :: Upvar ,
@@ -1189,12 +1199,11 @@ fn variant_info_for_coroutine<'tcx>(
1189
1199
let variant_layout = layout. for_variant ( cx, variant_idx) ;
1190
1200
let mut variant_size = Size :: ZERO ;
1191
1201
let fields = variant_def
1192
- . iter ( )
1193
- . enumerate ( )
1202
+ . iter_enumerated ( )
1194
1203
. map ( |( field_idx, local) | {
1195
1204
let field_name = coroutine. field_names [ * local] ;
1196
- let field_layout = variant_layout. field ( cx, field_idx) ;
1197
- let offset = variant_layout. fields . offset ( field_idx) ;
1205
+ let field_layout = variant_layout. field ( cx, field_idx. index ( ) ) ;
1206
+ let offset = variant_layout. fields . offset ( field_idx. index ( ) ) ;
1198
1207
// The struct is as large as the last field's end
1199
1208
variant_size = variant_size. max ( offset + field_layout. size ) ;
1200
1209
FieldInfo {
0 commit comments