From 0db2bd0c53c096f47569f07146e4890baa94d35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 30 Oct 2017 10:18:07 +0100 Subject: [PATCH] ir: Don't eagerly-resolve template alias declarations. Fixes #1118 --- src/ir/ty.rs | 17 +-- .../tests/issue-1118-using-forward-decl.rs | 119 ++++++++++++++++++ .../headers/issue-1118-using-forward-decl.hpp | 10 ++ 3 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 tests/expectations/tests/issue-1118-using-forward-decl.rs create mode 100644 tests/headers/issue-1118-using-forward-decl.hpp diff --git a/src/ir/ty.rs b/src/ir/ty.rs index bfb4c48e63..9a51c2b373 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 0000000000..27537627c2 --- /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::(), + 8usize, + concat!("Size of: ", stringify!(nsTArray_base)) + ); + assert_eq!( + ::std::mem::align_of::(), + 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::(), + 8usize, + concat!("Size of: ", stringify!(nsIContent)) + ); + assert_eq!( + ::std::mem::align_of::(), + 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::(), + 8usize, + concat!("Size of template specialization: ", stringify!(nsTArray)) + ); + assert_eq!( + ::std::mem::align_of::(), + 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::(), + 8usize, + concat!("Size of template specialization: ", stringify!(nsTArray)) + ); + assert_eq!( + ::std::mem::align_of::(), + 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 0000000000..b6ea63f69e --- /dev/null +++ b/tests/headers/issue-1118-using-forward-decl.hpp @@ -0,0 +1,10 @@ +template class nsTArray; +template using c = nsTArray; +class nsTArray_base { + int *d; +}; +template class nsTArray : nsTArray_base {}; +class nsIContent { + nsTArray foo; +}; +nsTArray *Gecko_GetAnonymousContentForElement();