diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-07-10 09:11:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-10 09:11:07 -0700 |
commit | ffc529d11f73101076888c77f3a70f0f8554703e (patch) | |
tree | cb5f39a7ec6ab95bbbc17b997aaa83745b54d3ba /src/codegen/mod.rs | |
parent | f19e576961d2e3832760ca22a8e62f8ab4f7f078 (diff) | |
parent | cb0ef01b167976d6c5447e123c96af4109af7d16 (diff) |
Auto merge of #802 - emilio:opaque, r=fitzgen
codegen: Fix some sloppiness in our handling of opaque types.
Fixes #801
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 50ebebf2..0621ea62 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1571,7 +1571,8 @@ impl CodeGenerator for CompInfo { } // Yeah, sorry about that. - if item.is_opaque(ctx, &()) { + let is_opaque = item.is_opaque(ctx, &()); + if is_opaque { fields.clear(); methods.clear(); @@ -1613,7 +1614,14 @@ impl CodeGenerator for CompInfo { // NOTE: This check is conveniently here to avoid the dummy fields we // may add for unused template parameters. if self.is_unsized(ctx) { - let has_address = layout.map_or(true, |l| l.size != 0); + let has_address = if is_opaque { + // Generate the address field if it's an opaque type and + // couldn't determine the layout of the blob. + layout.is_none() + } else { + layout.map_or(true, |l| l.size != 0) + }; + if has_address { let ty = BlobTyBuilder::new(Layout::new(1, 1)).build(); let field = StructFieldBuilder::named("_address") @@ -1670,9 +1678,11 @@ impl CodeGenerator for CompInfo { } if used_template_params.is_none() { - for var in self.inner_vars() { - ctx.resolve_item(*var) - .codegen(ctx, result, whitelisted_items, &()); + if !is_opaque { + for var in self.inner_vars() { + ctx.resolve_item(*var) + .codegen(ctx, result, whitelisted_items, &()); + } } if ctx.options().layout_tests { @@ -1707,8 +1717,8 @@ impl CodeGenerator for CompInfo { }) .count() > 1; - let should_skip_field_offset_checks = item.is_opaque(ctx, &()) || - too_many_base_vtables; + let should_skip_field_offset_checks = + is_opaque || too_many_base_vtables; let check_field_offset = if should_skip_field_offset_checks { None |