summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser.rs19
-rw-r--r--src/types.rs15
2 files changed, 22 insertions, 12 deletions
diff --git a/src/parser.rs b/src/parser.rs
index 7a1f43d2..843a39b0 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -700,10 +700,10 @@ fn visit_composite(cursor: &Cursor, parent: &Cursor,
}
CXCursor_CXXBaseSpecifier => {
let ty = conv_ty(ctx, &cursor.cur_type(), cursor);
- let fieldname = if !ci.members.is_empty() {
- format!("_base{}", ci.members.len())
- } else {
+ let fieldname = if ci.members.is_empty() {
"_base".to_string()
+ } else {
+ format!("_base{}", ci.members.len())
};
let found_virtual_base = if ci.members.is_empty() {
false
@@ -716,17 +716,20 @@ fn visit_composite(cursor: &Cursor, parent: &Cursor,
} else {
false
};
- let field = FieldInfo::new(fieldname, ty.clone(), "".to_owned(), None);
+
+ if let TComp(ref info) = ty {
+ ci.has_nonempty_base |= !info.borrow().members.is_empty();
+ ci.has_destructor |= info.borrow().has_destructor;
+ ci.typedefs.extend(info.borrow().typedefs.clone().into_iter());
+ }
+
+ let field = FieldInfo::new(fieldname, ty, "".to_owned(), None);
if !found_virtual_base && cursor.is_virtual_base() {
ci.members.insert(0, CompMember::Field(field));
ci.has_vtable = true;
} else {
ci.members.push(CompMember::Field(field));
}
- if let TComp(ref info) = ty {
- ci.has_nonempty_base |= !info.borrow().members.is_empty();
- ci.typedefs.extend(info.borrow().typedefs.clone().into_iter());
- }
ci.base_members += 1;
}
CXCursor_CXXMethod => {
diff --git a/src/types.rs b/src/types.rs
index 96b03c17..586c7ea9 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -435,11 +435,18 @@ impl CompInfo {
pub fn has_destructor(&self) -> bool {
self.has_destructor ||
- self.ref_template.as_ref().map(|t| t.has_destructor()).unwrap_or(false) ||
- self.members.iter().any(|m| match *m {
+ self.ref_template.as_ref().map_or(false, |t| t.has_destructor()) ||
+ self.args.iter().any(|t| t != &TVoid && t.has_destructor()) ||
+ self.members.iter().enumerate().any(|(index, m)| match *m {
CompMember::Field(ref f) |
- CompMember::CompField(_, ref f)
- => f.ty.is_opaque() || f.ty.has_destructor() || !f.ty.is_translatable(),
+ CompMember::CompField(_, ref f) => {
+ // Base members may not be resolved yet
+ if index < self.base_members {
+ f.ty.has_destructor()
+ } else {
+ f.ty.has_destructor() || !f.ty.is_translatable()
+ }
+ },
_ => false,
})
}