Skip to content

Commit

Permalink
Merge pull request #1495 from tromey/packed-only-vtable
Browse files Browse the repository at this point in the history
Fix layout with packed class that only has a vtable
  • Loading branch information
emilio authored Jan 18, 2019
2 parents 42bfc23 + 5c92043 commit 7a5ae20
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/ir/comp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1517,6 +1517,10 @@ impl CompInfo {
}) {
info!("Found a struct that was defined within `#pragma packed(...)`");
return true;
} else if self.has_own_virtual_method {
if parent_layout.align == 1 {
return true;
}
}
}

Expand Down
39 changes: 39 additions & 0 deletions tests/expectations/tests/packed-vtable.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* automatically generated by rust-bindgen */

#![allow(
dead_code,
non_snake_case,
non_camel_case_types,
non_upper_case_globals
)]
#![cfg(feature = "nightly")]

#[repr(C)]
pub struct PackedVtable__bindgen_vtable(::std::os::raw::c_void);
#[repr(C, packed)]
#[derive(Debug)]
pub struct PackedVtable {
pub vtable_: *const PackedVtable__bindgen_vtable,
}
#[test]
fn bindgen_test_layout_PackedVtable() {
assert_eq!(
::std::mem::size_of::<PackedVtable>(),
8usize,
concat!("Size of: ", stringify!(PackedVtable))
);
assert_eq!(
::std::mem::align_of::<PackedVtable>(),
1usize,
concat!("Alignment of ", stringify!(PackedVtable))
);
}
impl Default for PackedVtable {
fn default() -> Self {
unsafe { ::std::mem::zeroed() }
}
}
extern "C" {
#[link_name = "\u{1}_ZN12PackedVtableD1Ev"]
pub fn PackedVtable_PackedVtable_destructor(this: *mut PackedVtable);
}
10 changes: 10 additions & 0 deletions tests/headers/packed-vtable.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// bindgen-flags: --raw-line '#![cfg(feature = "nightly")]' --rust-target 1.33 -- -x c++ -std=c++11

#pragma pack(1)

// This should be packed.
struct PackedVtable {
virtual ~PackedVtable();
};

#pragma pack()

0 comments on commit 7a5ae20

Please sign in to comment.