summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-07-10 09:11:07 -0700
committerGitHub <noreply@github.com>2017-07-10 09:11:07 -0700
commitffc529d11f73101076888c77f3a70f0f8554703e (patch)
treecb5f39a7ec6ab95bbbc17b997aaa83745b54d3ba /src/codegen/mod.rs
parentf19e576961d2e3832760ca22a8e62f8ab4f7f078 (diff)
parentcb0ef01b167976d6c5447e123c96af4109af7d16 (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.rs24
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