From ae1b386f865e048b1ba2dbea93c621c6a68dfdf1 Mon Sep 17 00:00:00 2001 From: Emilio Cobos Álvarez Date: Mon, 6 Jun 2022 12:23:25 +0200 Subject: codegen: tests: Put each individual field test in a function. So that rustc doesn't take too much stack space without optimizations. Fixes #2218 --- src/codegen/mod.rs | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'src/codegen/mod.rs') diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index eee9f098..ee4a6bfd 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2176,19 +2176,23 @@ impl CodeGenerator for CompInfo { { vec![] } else { - let asserts = self.fields() - .iter() - .filter_map(|field| match *field { - Field::DataMember(ref f) if f.name().is_some() => Some(f), - _ => None, - }) - .flat_map(|field| { - let name = field.name().unwrap(); - field.offset().map(|offset| { - let field_offset = offset / 8; - let field_name = ctx.rust_ident(name); - - quote! { + self.fields() + .iter() + .filter_map(|field| match *field { + Field::DataMember(ref f) if f.name().is_some() => Some(f), + _ => None, + }) + .flat_map(|field| { + let name = field.name().unwrap(); + field.offset().map(|offset| { + let field_offset = offset / 8; + let field_name = ctx.rust_ident(name); + // Put each check in its own function, so + // that rustc with opt-level=0 doesn't take + // too much stack space, see #2218. + let test_fn = Ident::new(&format!("test_field_{}", name), Span::call_site()); + quote! { + fn #test_fn() { assert_eq!( unsafe { let uninit = ::#prefix::mem::MaybeUninit::<#canonical_ident>::uninit(); @@ -2199,11 +2203,11 @@ impl CodeGenerator for CompInfo { concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name)) ); } - }) + #test_fn(); + } }) - .collect::>(); - - asserts + }) + .collect::>() }; let item = quote! { -- cgit v1.2.3