summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2016-11-21 10:19:05 +0100
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2016-11-21 19:18:29 +0100
commit91f279f735e3501cd738e4bff0371b41a830410c (patch)
treea581696fdec9b6614812473509e6798f67457635
parent326796e6af5e05135427fd42475ca20f2de38a41 (diff)
ir: Pass the location instead of the declaration for TemplateRef's.
-rw-r--r--libbindgen/src/ir/ty.rs19
-rw-r--r--libbindgen/tests/expectations/tests/templateref_opaque.rs20
-rw-r--r--libbindgen/tests/headers/templateref_opaque.hpp11
3 files changed, 44 insertions, 6 deletions
diff --git a/libbindgen/src/ir/ty.rs b/libbindgen/src/ir/ty.rs
index 1980b088..1e4c40ef 100644
--- a/libbindgen/src/ir/ty.rs
+++ b/libbindgen/src/ir/ty.rs
@@ -685,26 +685,33 @@ impl Type {
CXCursor_TemplateRef => {
let referenced = location.referenced().unwrap();
let referenced_ty = referenced.cur_type();
- let referenced_declaration =
- Some(referenced_ty.declaration());
+
+ debug!("TemplateRef {:?} {:?} {:?}",
+ location,
+ referenced,
+ referenced_ty);
return Self::from_clang_ty(potential_id,
&referenced_ty,
- referenced_declaration,
+ Some(referenced),
parent_id,
ctx);
}
CXCursor_TypeRef => {
let referenced = location.referenced().unwrap();
let referenced_ty = referenced.cur_type();
- let referenced_declaration =
- Some(referenced_ty.declaration());
+ let declaration = referenced_ty.declaration();
+
+ debug!("TypeRef {:?} {:?} {:?}",
+ location,
+ referenced,
+ referenced_ty);
let item =
Item::from_ty_or_ref_with_id(
potential_id,
referenced_ty,
- referenced_declaration,
+ Some(declaration),
parent_id,
ctx);
return Ok(ParseResult::AlreadyResolved(item));
diff --git a/libbindgen/tests/expectations/tests/templateref_opaque.rs b/libbindgen/tests/expectations/tests/templateref_opaque.rs
new file mode 100644
index 00000000..d69254c8
--- /dev/null
+++ b/libbindgen/tests/expectations/tests/templateref_opaque.rs
@@ -0,0 +1,20 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(non_snake_case)]
+
+
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct detail_PointerType<T> {
+ pub _address: u8,
+ pub _phantom_0: ::std::marker::PhantomData<T>,
+}
+pub type detail_PointerType_Type<T> = *mut T;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct UniquePtr<T> {
+ pub _address: u8,
+ pub _phantom_0: ::std::marker::PhantomData<T>,
+}
+pub type UniquePtr_Pointer<T> = detail_PointerType<T>;
diff --git a/libbindgen/tests/headers/templateref_opaque.hpp b/libbindgen/tests/headers/templateref_opaque.hpp
new file mode 100644
index 00000000..ca154c34
--- /dev/null
+++ b/libbindgen/tests/headers/templateref_opaque.hpp
@@ -0,0 +1,11 @@
+
+namespace detail {
+template<typename T>
+struct PointerType {
+ typedef T* Type;
+};
+}
+template<typename T>
+class UniquePtr {
+ typedef typename detail::PointerType<T> Pointer;
+};