diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2022-06-06 12:23:25 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2022-06-06 13:22:48 +0200 |
commit | ae1b386f865e048b1ba2dbea93c621c6a68dfdf1 (patch) | |
tree | 74d5ab8fe67452d2056c95395d8675672bd70287 /src/codegen/mod.rs | |
parent | 355181134094202e0caae60c1fbf145d8e6ca84b (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
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 38 |
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! { |