diff options
author | Artem Biryukov <impowski@protonmail.ch> | 2016-11-21 20:00:19 +0300 |
---|---|---|
committer | Artem Biryukov <impowski@protonmail.ch> | 2016-11-21 20:00:19 +0300 |
commit | 5c764836380a2987da0db3997d26589e9e79d8c8 (patch) | |
tree | 9b947d9f569c62a871d34f043e016087004bd948 /libbindgen/src/codegen/mod.rs | |
parent | 5ee3601ea9eb953df23b0454f30662f2c154f7a4 (diff) |
Apply fixes due code review for issue #57
Diffstat (limited to 'libbindgen/src/codegen/mod.rs')
-rw-r--r-- | libbindgen/src/codegen/mod.rs | 62 |
1 files changed, 25 insertions, 37 deletions
diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 6730a910..392ec28a 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -653,45 +653,33 @@ impl CodeGenerator for CompInfo { // Don't output classes with template parameters that aren't types, and // also don't output template specializations, neither total or partial. - // - // TODO: Generate layout tests for template specializations, yay! - - // TODO (imp): I will keep it like that right now and move it to function later - if self.has_non_type_template_params() || - self.is_template_specialization() { - let layout = item.kind().expect_type().layout(ctx); - let canonical_name = item.canonical_name(ctx); - - if let Some(layout) = layout { + if self.has_non_type_template_params() { + return; + } - let mut types = String::new(); + if self.is_template_specialization() { + let layout = item.kind().expect_type().layout(ctx); - for arg in self.template_args() { - if let Some(name) = ctx.resolve_type(*arg).name() { - // hope this isn't bad - types.push_str(format!("_{}", name).as_str()); - } - } - - let fn_name = format!("bindgen_test_layout_template_{}{}", canonical_name, types); - let fn_name = ctx.rust_ident_raw(&fn_name); - let ident = item.to_rust_ty(ctx); - let prefix = ctx.trait_prefix(); - let size_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::size_of::<$ident>()); - let align_of_expr = quote_expr!(ctx.ext_cx(), - ::$prefix::mem::align_of::<$ident>()); - let size = layout.size; - let align = layout.align; - let item = quote_item!(ctx.ext_cx(), - #[test] - fn $fn_name() { - assert_eq!($size_of_expr, $size); - assert_eq!($align_of_expr, $align); - }).unwrap(); - result.push(item); - } - return; + if let Some(layout) = layout { + let fn_name = format!("__bindgen_test_layout_template_{}", item.id().as_usize()); + let fn_name = ctx.rust_ident_raw(&fn_name); + let ident = item.to_rust_ty(ctx); + let prefix = ctx.trait_prefix(); + let size_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::size_of::<$ident>()); + let align_of_expr = quote_expr!(ctx.ext_cx(), + ::$prefix::mem::align_of::<$ident>()); + let size = layout.size; + let align = layout.align; + let item = quote_item!(ctx.ext_cx(), + #[test] + fn $fn_name() { + assert_eq!($size_of_expr, $size); + assert_eq!($align_of_expr, $align); + }).unwrap(); + result.push(item); + } + return; } let applicable_template_args = item.applicable_template_args(ctx); |