Skip to content

Commit

Permalink
ir: Don't eagerly-resolve template alias declarations.
Browse files Browse the repository at this point in the history
  • Loading branch information
emilio committed Oct 30, 2017
1 parent 8d045d2 commit 0db2bd0
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 7 deletions.
17 changes: 10 additions & 7 deletions src/ir/ty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -925,18 +925,21 @@ impl Type {
CXCursor_TypeAliasDecl => {
let current = cur.cur_type();

debug_assert!(current.kind() ==
CXType_Typedef);
debug_assert_eq!(
current.kind(),
CXType_Typedef
);

name = current.spelling();

let inner_ty = cur.typedef_type()
.expect("Not valid Type?");
inner =
Item::from_ty(&inner_ty,
cur,
Some(potential_id),
ctx);
inner = Ok(Item::from_ty_or_ref(
inner_ty,
cur,
Some(potential_id),
ctx,
));
}
CXCursor_TemplateTypeParameter => {
let param =
Expand Down
119 changes: 119 additions & 0 deletions tests/expectations/tests/issue-1118-using-forward-decl.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/* automatically generated by rust-bindgen */


#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]


pub type c = nsTArray;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsTArray_base {
pub d: *mut ::std::os::raw::c_int,
}
#[test]
fn bindgen_test_layout_nsTArray_base() {
assert_eq!(
::std::mem::size_of::<nsTArray_base>(),
8usize,
concat!("Size of: ", stringify!(nsTArray_base))
);
assert_eq!(
::std::mem::align_of::<nsTArray_base>(),
8usize,
concat!("Alignment of ", stringify!(nsTArray_base))
);
assert_eq!(
unsafe { &(*(0 as *const nsTArray_base)).d as *const _ as usize },
0usize,
concat!(
"Alignment of field: ",
stringify!(nsTArray_base),
"::",
stringify!(d)
)
);
}
impl Default for nsTArray_base {
fn default() -> Self {
unsafe { ::std::mem::zeroed() }
}
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsTArray {
pub _base: nsTArray_base,
}
impl Default for nsTArray {
fn default() -> Self {
unsafe { ::std::mem::zeroed() }
}
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsIContent {
pub foo: nsTArray,
}
#[test]
fn bindgen_test_layout_nsIContent() {
assert_eq!(
::std::mem::size_of::<nsIContent>(),
8usize,
concat!("Size of: ", stringify!(nsIContent))
);
assert_eq!(
::std::mem::align_of::<nsIContent>(),
8usize,
concat!("Alignment of ", stringify!(nsIContent))
);
assert_eq!(
unsafe { &(*(0 as *const nsIContent)).foo as *const _ as usize },
0usize,
concat!(
"Alignment of field: ",
stringify!(nsIContent),
"::",
stringify!(foo)
)
);
}
impl Default for nsIContent {
fn default() -> Self {
unsafe { ::std::mem::zeroed() }
}
}
extern "C" {
#[link_name = "\u{1}_Z35Gecko_GetAnonymousContentForElementv"]
pub fn Gecko_GetAnonymousContentForElement() -> *mut nsTArray;
}
#[test]
fn __bindgen_test_layout_nsTArray_open0_ptr_nsIContent_close0_instantiation() {
assert_eq!(
::std::mem::size_of::<nsTArray>(),
8usize,
concat!("Size of template specialization: ", stringify!(nsTArray))
);
assert_eq!(
::std::mem::align_of::<nsTArray>(),
8usize,
concat!(
"Alignment of template specialization: ",
stringify!(nsTArray)
)
);
}
#[test]
fn __bindgen_test_layout_nsTArray_open0_ptr_nsIContent_close0_instantiation_1() {
assert_eq!(
::std::mem::size_of::<nsTArray>(),
8usize,
concat!("Size of template specialization: ", stringify!(nsTArray))
);
assert_eq!(
::std::mem::align_of::<nsTArray>(),
8usize,
concat!(
"Alignment of template specialization: ",
stringify!(nsTArray)
)
);
}
10 changes: 10 additions & 0 deletions tests/headers/issue-1118-using-forward-decl.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
template <class> class nsTArray;
template <class b> using c = nsTArray<b>;
class nsTArray_base {
int *d;
};
template <class> class nsTArray : nsTArray_base {};
class nsIContent {
nsTArray<nsIContent *> foo;
};
nsTArray<nsIContent*> *Gecko_GetAnonymousContentForElement();

0 comments on commit 0db2bd0

Please sign in to comment.