diff --git a/gen/src/write.rs b/gen/src/write.rs index a9b8ddee1..32ccbf6ef 100644 --- a/gen/src/write.rs +++ b/gen/src/write.rs @@ -62,7 +62,9 @@ pub(super) fn gen( match api { Api::Struct(strct) => { out.next_section(); - write_struct(out, strct); + if !types.cxx.contains(&strct.ident) { + write_struct(out, strct); + } } Api::Enum(enm) => { out.next_section(); diff --git a/macro/src/expand.rs b/macro/src/expand.rs index 9cfe3b564..c2d88ce06 100644 --- a/macro/src/expand.rs +++ b/macro/src/expand.rs @@ -43,7 +43,8 @@ fn expand(ffi: Module, apis: &[Api], types: &Types) -> TokenStream { Api::Struct(strct) => expanded.extend(expand_struct(strct)), Api::Enum(enm) => expanded.extend(expand_enum(enm)), Api::CxxType(ety) => { - if !types.enums.contains_key(&ety.ident) { + let ident = &ety.ident; + if !types.structs.contains_key(ident) && !types.enums.contains_key(ident) { expanded.extend(expand_cxx_type(namespace, ety)); } } diff --git a/syntax/check.rs b/syntax/check.rs index f82396463..147984e7e 100644 --- a/syntax/check.rs +++ b/syntax/check.rs @@ -179,9 +179,6 @@ fn check_api_struct(cx: &mut Check, strct: &Struct) { if let Some(ety) = cx.types.untrusted.get(ident) { let msg = "extern shared struct must be declared in an `unsafe extern` block"; cx.error(ety, msg); - } else { - let span = span_for_struct_error(strct); - cx.error(span, "extern C++ structs are not implemented yet"); } }