summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-10-30 10:18:07 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-10-30 10:21:48 +0100
commit0db2bd0c53c096f47569f07146e4890baa94d35a (patch)
tree031f4be01c733f447b8758fc02fbf066f84dd066
parent8d045d2f20f004bcc813bcf6aa68b170b6aa9c77 (diff)
ir: Don't eagerly-resolve template alias declarations.
Fixes #1118
-rw-r--r--src/ir/ty.rs17
-rw-r--r--tests/expectations/tests/issue-1118-using-forward-decl.rs119
-rw-r--r--tests/headers/issue-1118-using-forward-decl.hpp10
3 files changed, 139 insertions, 7 deletions
diff --git a/src/ir/ty.rs b/src/ir/ty.rs
index bfb4c48e..9a51c2b3 100644
--- a/src/ir/ty.rs
+++ b/src/ir/ty.rs
@@ -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 =
diff --git a/tests/expectations/tests/issue-1118-using-forward-decl.rs b/tests/expectations/tests/issue-1118-using-forward-decl.rs
new file mode 100644
index 00000000..27537627
--- /dev/null
+++ b/tests/expectations/tests/issue-1118-using-forward-decl.rs
@@ -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)
+ )
+ );
+}
diff --git a/tests/headers/issue-1118-using-forward-decl.hpp b/tests/headers/issue-1118-using-forward-decl.hpp
new file mode 100644
index 00000000..b6ea63f6
--- /dev/null
+++ b/tests/headers/issue-1118-using-forward-decl.hpp
@@ -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();