Skip to content

Commit d4f83a9

Browse files
author
bors-servo
authored
Auto merge of #696 - emilio:template-alias-inst, r=fitzgen
ir: Handle properly template alias instantiations in clang >3.9
2 parents 107b7b9 + b2e5613 commit d4f83a9

File tree

4 files changed

+46
-20
lines changed

4 files changed

+46
-20
lines changed

src/ir/context.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ impl<'ctx> BindgenContext<'ctx> {
299299
let id = item.id();
300300
let is_type = item.kind().is_type();
301301
let is_unnamed = is_type && item.expect_type().name().is_none();
302+
let is_template_instantiation =
303+
is_type && item.expect_type().is_template_instantiation();
302304

303305
// Be sure to track all the generated children under namespace, even
304306
// those generated after resolving typerefs, etc.
@@ -317,7 +319,7 @@ impl<'ctx> BindgenContext<'ctx> {
317319
// Unnamed items can have an USR, but they can't be referenced from
318320
// other sites explicitly and the USR can match if the unnamed items are
319321
// nested, so don't bother tracking them.
320-
if is_type && declaration.is_some() {
322+
if is_type && !is_template_instantiation && declaration.is_some() {
321323
let mut declaration = declaration.unwrap();
322324
if !declaration.is_valid() {
323325
if let Some(location) = location {

src/ir/template.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -251,25 +251,30 @@ impl TemplateInstantiation {
251251
}
252252
});
253253

254-
let definition = ty.declaration()
255-
.specialized()
256-
.or_else(|| {
257-
let mut template_ref = None;
258-
ty.declaration().visit(|child| {
259-
if child.kind() == CXCursor_TemplateRef {
260-
template_ref = Some(child);
261-
return CXVisit_Break;
262-
}
254+
let declaration = ty.declaration();
255+
let definition = if declaration.kind() == CXCursor_TypeAliasTemplateDecl {
256+
Some(declaration)
257+
} else {
258+
declaration
259+
.specialized()
260+
.or_else(|| {
261+
let mut template_ref = None;
262+
ty.declaration().visit(|child| {
263+
if child.kind() == CXCursor_TemplateRef {
264+
template_ref = Some(child);
265+
return CXVisit_Break;
266+
}
263267

264-
// Instantiations of template aliases might have the
265-
// TemplateRef to the template alias definition arbitrarily
266-
// deep, so we need to recurse here and not only visit
267-
// direct children.
268-
CXChildVisit_Recurse
269-
});
268+
// Instantiations of template aliases might have the
269+
// TemplateRef to the template alias definition arbitrarily
270+
// deep, so we need to recurse here and not only visit
271+
// direct children.
272+
CXChildVisit_Recurse
273+
});
270274

271-
template_ref.and_then(|cur| cur.referenced())
272-
});
275+
template_ref.and_then(|cur| cur.referenced())
276+
})
277+
};
273278

274279
let definition = match definition {
275280
Some(def) => def,

src/ir/ty.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ impl Type {
109109
}
110110
}
111111

112+
/// Is this a template instantiation type?
113+
pub fn is_template_instantiation(&self) -> bool {
114+
match self.kind {
115+
TypeKind::TemplateInstantiation(..) => true,
116+
_ => false,
117+
}
118+
}
119+
112120
/// Is this a template alias type?
113121
pub fn is_template_alias(&self) -> bool {
114122
match self.kind {

tests/expectations/tests/template.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,18 @@ fn __bindgen_test_layout_Foo_instantiation_95() {
256256
Foo<::std::os::raw::c_int> ) ));
257257
}
258258
#[test]
259-
fn __bindgen_test_layout_Rooted_instantiation_106() {
259+
fn __bindgen_test_layout_Foo_instantiation_101() {
260+
assert_eq!(::std::mem::size_of::<Foo<::std::os::raw::c_int>>() , 24usize ,
261+
concat ! (
262+
"Size of template specialization: " , stringify ! (
263+
Foo<::std::os::raw::c_int> ) ));
264+
assert_eq!(::std::mem::align_of::<Foo<::std::os::raw::c_int>>() , 8usize ,
265+
concat ! (
266+
"Alignment of template specialization: " , stringify ! (
267+
Foo<::std::os::raw::c_int> ) ));
268+
}
269+
#[test]
270+
fn __bindgen_test_layout_Rooted_instantiation_111() {
260271
assert_eq!(::std::mem::size_of::<Rooted<*mut ::std::os::raw::c_void>>() ,
261272
24usize , concat ! (
262273
"Size of template specialization: " , stringify ! (
@@ -267,7 +278,7 @@ fn __bindgen_test_layout_Rooted_instantiation_106() {
267278
Rooted<*mut ::std::os::raw::c_void> ) ));
268279
}
269280
#[test]
270-
fn __bindgen_test_layout_WithDtor_instantiation_114() {
281+
fn __bindgen_test_layout_WithDtor_instantiation_123() {
271282
assert_eq!(::std::mem::size_of::<WithDtor<::std::os::raw::c_int>>() ,
272283
4usize , concat ! (
273284
"Size of template specialization: " , stringify ! (

0 commit comments

Comments
 (0)