Skip to content

Commit eaf3a9e

Browse files
committed
codegen: tests: Put each individual field test in a function.
So that rustc doesn't take too much stack space without optimizations. Fixes #2218
1 parent 3551811 commit eaf3a9e

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

src/codegen/mod.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,19 +2176,23 @@ impl CodeGenerator for CompInfo {
21762176
{
21772177
vec![]
21782178
} 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() {
21922196
assert_eq!(
21932197
unsafe {
21942198
let uninit = ::#prefix::mem::MaybeUninit::<#canonical_ident>::uninit();
@@ -2199,11 +2203,11 @@ impl CodeGenerator for CompInfo {
21992203
concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name))
22002204
);
22012205
}
2202-
})
2206+
#test_fn();
2207+
}
22032208
})
2204-
.collect::<Vec<proc_macro2::TokenStream>>();
2205-
2206-
asserts
2209+
})
2210+
.collect::<Vec<proc_macro2::TokenStream>>()
22072211
};
22082212

22092213
let item = quote! {

0 commit comments

Comments
 (0)