@@ -2176,19 +2176,23 @@ impl CodeGenerator for CompInfo {
2176
2176
{
2177
2177
vec ! [ ]
2178
2178
} else {
2179
- let asserts = self . fields ( )
2180
- . iter ( )
2181
- . filter_map ( |field| match * field {
2182
- Field :: DataMember ( ref f) if f. name ( ) . is_some ( ) => Some ( f) ,
2183
- _ => None ,
2184
- } )
2185
- . flat_map ( |field| {
2186
- let name = field. name ( ) . unwrap ( ) ;
2187
- field. offset ( ) . map ( |offset| {
2188
- let field_offset = offset / 8 ;
2189
- let field_name = ctx. rust_ident ( name) ;
2190
-
2191
- quote ! {
2179
+ self . fields ( )
2180
+ . iter ( )
2181
+ . filter_map ( |field| match * field {
2182
+ Field :: DataMember ( ref f) if f. name ( ) . is_some ( ) => Some ( f) ,
2183
+ _ => None ,
2184
+ } )
2185
+ . flat_map ( |field| {
2186
+ let name = field. name ( ) . unwrap ( ) ;
2187
+ field. offset ( ) . map ( |offset| {
2188
+ let field_offset = offset / 8 ;
2189
+ let field_name = ctx. rust_ident ( name) ;
2190
+ // Put each check in its own function, so
2191
+ // that rustc with opt-level=0 doesn't take
2192
+ // too much stack space, see #2218.
2193
+ let test_fn = Ident :: new ( & format ! ( "test_field_{}" , name) , Span :: call_site ( ) ) ;
2194
+ quote ! {
2195
+ fn #test_fn( ) {
2192
2196
assert_eq!(
2193
2197
unsafe {
2194
2198
let uninit = :: #prefix:: mem:: MaybeUninit :: <#canonical_ident>:: uninit( ) ;
@@ -2199,11 +2203,11 @@ impl CodeGenerator for CompInfo {
2199
2203
concat!( "Offset of field: " , stringify!( #canonical_ident) , "::" , stringify!( #field_name) )
2200
2204
) ;
2201
2205
}
2202
- } )
2206
+ #test_fn( ) ;
2207
+ }
2203
2208
} )
2204
- . collect :: < Vec < proc_macro2:: TokenStream > > ( ) ;
2205
-
2206
- asserts
2209
+ } )
2210
+ . collect :: < Vec < proc_macro2:: TokenStream > > ( )
2207
2211
} ;
2208
2212
2209
2213
let item = quote ! {
0 commit comments