diff --git a/src/ir/ty.rs b/src/ir/ty.rs index e049ed6520..634dfb5d37 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -1120,7 +1120,16 @@ impl Type { let inner = cursor.typedef_type().expect("Not valid Type?"); let inner = Item::from_ty_or_ref(inner, location, None, ctx); - TypeKind::Alias(inner) + if inner == potential_id { + warn!( + "Generating oqaque type instead of self-referential \ + typedef"); + // This can happen if we bail out of recursive situations + // within the clang parsing. + TypeKind::Opaque + } else { + TypeKind::Alias(inner) + } } CXType_Enum => { let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?"); diff --git a/tests/expectations/tests/constified-enum-module-overflow.rs b/tests/expectations/tests/constified-enum-module-overflow.rs new file mode 100644 index 0000000000..4a799ef8e5 --- /dev/null +++ b/tests/expectations/tests/constified-enum-module-overflow.rs @@ -0,0 +1,54 @@ +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct B { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct C { + pub _address: u8, +} +pub type C_U = B; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct A { + pub u: u8, +} +#[test] +fn bindgen_test_layout_A() { + assert_eq!( + ::std::mem::size_of::(), + 1usize, + concat!("Size of: ", stringify!(A)) + ); + assert_eq!( + ::std::mem::align_of::(), + 1usize, + concat!("Alignment of ", stringify!(A)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).u as *const _ as usize }, + 0usize, + concat!("Offset of field: ", stringify!(A), "::", stringify!(u)) + ); +} +#[test] +fn __bindgen_test_layout_C_open0_A_close0_instantiation() { + assert_eq!( + ::std::mem::size_of::(), + 1usize, + concat!("Size of template specialization: ", stringify!(C)) + ); + assert_eq!( + ::std::mem::align_of::(), + 1usize, + concat!("Alignment of template specialization: ", stringify!(C)) + ); +} diff --git a/tests/headers/constified-enum-module-overflow.hpp b/tests/headers/constified-enum-module-overflow.hpp new file mode 100644 index 0000000000..d48f2be1b2 --- /dev/null +++ b/tests/headers/constified-enum-module-overflow.hpp @@ -0,0 +1,8 @@ +template class B{}; +template class C { +public: + using U = B; +}; +class A : C { + U u; +};