From a2798978abb11c926223d14fe5129a7b699e81b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 31 Oct 2017 17:41:00 +0100 Subject: [PATCH] ir: We can't guarantee the type to be in the item map while propagating AlreadyResolved. The item may come from a recursive check down the stack, and as we say there: > Unchecked because we haven't finished this type yet. Fixes #1127 --- src/ir/item.rs | 2 +- tests/expectations/tests/issue-1127-not-yet-type.rs | 11 +++++++++++ tests/headers/issue-1127-not-yet-type.hpp | 13 +++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/issue-1127-not-yet-type.rs create mode 100644 tests/headers/issue-1127-not-yet-type.hpp diff --git a/src/ir/item.rs b/src/ir/item.rs index 9ed7267d7f..5c79ad702c 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -1521,7 +1521,7 @@ impl ClangItemParser for Item { let result = Type::from_clang_ty(id, ty, location, parent_id, ctx); let relevant_parent_id = parent_id.unwrap_or(current_module); let ret = match result { - Ok(ParseResult::AlreadyResolved(ty)) => Ok(ty.expect_type_id(ctx)), + Ok(ParseResult::AlreadyResolved(ty)) => Ok(ty.as_type_id_unchecked()), Ok(ParseResult::New(item, declaration)) => { ctx.add_item( Item::new( diff --git a/tests/expectations/tests/issue-1127-not-yet-type.rs b/tests/expectations/tests/issue-1127-not-yet-type.rs new file mode 100644 index 0000000000..755eef28b1 --- /dev/null +++ b/tests/expectations/tests/issue-1127-not-yet-type.rs @@ -0,0 +1,11 @@ +/* automatically generated by rust-bindgen */ + + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct A { + pub _address: u8, +} diff --git a/tests/headers/issue-1127-not-yet-type.hpp b/tests/headers/issue-1127-not-yet-type.hpp new file mode 100644 index 0000000000..8202e75326 --- /dev/null +++ b/tests/headers/issue-1127-not-yet-type.hpp @@ -0,0 +1,13 @@ +// bindgen-flags: -- -std=c++11 + +template struct A; +template struct _Map_base; +template +struct _Map_base<_Pair, _Traits, true> { + using __hashtable_base = A<_Traits>; + using key_type = typename __hashtable_base::key_type; + using mapped_type = typename _Pair::type; + mapped_type &at(const key_type &); +}; +template +auto _Map_base<_Pair, _Traits, true>::at(const key_type &) -> mapped_type & {}