summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2022-06-06 12:23:25 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2022-06-06 13:22:48 +0200
commitae1b386f865e048b1ba2dbea93c621c6a68dfdf1 (patch)
tree74d5ab8fe67452d2056c95395d8675672bd70287
parent355181134094202e0caae60c1fbf145d8e6ca84b (diff)
codegen: tests: Put each individual field test in a function.
So that rustc doesn't take too much stack space without optimizations. Fixes #2218
-rw-r--r--src/codegen/mod.rs38
1 files changed, 21 insertions, 17 deletions
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::<Vec<proc_macro2::TokenStream>>();
-
- asserts
+ })
+ .collect::<Vec<proc_macro2::TokenStream>>()
};
let item = quote! {