diff options
author | Emilio Cobos Álvarez <me@emiliocobos.me> | 2016-04-15 20:31:45 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <me@emiliocobos.me> | 2016-04-15 20:31:45 +0200 |
commit | e7c644ed4aa0e3040851571b177d39c10efa001b (patch) | |
tree | 9ff7e4a92c56ecc481fac23c2ad55ef30a178601 | |
parent | 34185115a8bad9558326ce52f4459430fa3ff83c (diff) |
bindgen: Correctly resolve class template parameters on has_destructor
-rw-r--r-- | src/parser.rs | 19 | ||||
-rw-r--r-- | src/types.rs | 15 |
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, }) } |