Parse extern C++ structs
diff --git a/syntax/check.rs b/syntax/check.rs
index 7b84b18..5980f75 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -71,7 +71,10 @@
fn check_type_box(cx: &mut Check, ptr: &Ty1) {
if let Type::Ident(ident) = &ptr.inner {
- if cx.types.cxx.contains(ident) && !cx.types.enums.contains_key(ident) {
+ if cx.types.cxx.contains(ident)
+ && !cx.types.structs.contains_key(ident)
+ && !cx.types.enums.contains_key(ident)
+ {
cx.error(ptr, error::BOX_CXX_TYPE.msg);
}
@@ -85,7 +88,10 @@
fn check_type_rust_vec(cx: &mut Check, ty: &Ty1) {
if let Type::Ident(ident) = &ty.inner {
- if cx.types.cxx.contains(ident) && !cx.types.enums.contains_key(ident) {
+ if cx.types.cxx.contains(ident)
+ && !cx.types.structs.contains_key(ident)
+ && !cx.types.enums.contains_key(ident)
+ {
cx.error(ty, "Rust Vec containing C++ type is not supported yet");
return;
}
@@ -168,6 +174,11 @@
cx.error(span, "structs without any fields are not supported");
}
+ if cx.types.cxx.contains(&strct.ident) {
+ let span = span_for_struct_error(strct);
+ cx.error(span, "extern C++ structs are not implemented yet");
+ }
+
for field in &strct.fields {
if is_unsized(cx, &field.ty) {
let desc = describe(cx, &field.ty);
@@ -321,7 +332,9 @@
_ => return false,
};
ident == CxxString
- || cx.types.cxx.contains(ident) && !cx.types.enums.contains_key(ident)
+ || cx.types.cxx.contains(ident)
+ && !cx.types.structs.contains_key(ident)
+ && !cx.types.enums.contains_key(ident)
|| cx.types.rust.contains(ident)
}