diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 6 | ||||
-rw-r--r-- | src/trans/enumerate.cpp | 5 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index f891d267..a4b0387a 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -196,6 +196,7 @@ namespace { } m_options; ::std::vector< ::std::pair< ::HIR::GenericPath, const ::HIR::Struct*> > m_box_glue_todo; + ::std::set< ::HIR::TypeRef> m_emitted_fn_types; public: CodeGenerator_C(const ::HIR::Crate& crate, const ::std::string& outfile): m_crate(crate), @@ -819,6 +820,11 @@ namespace { } void emit_type_fn(const ::HIR::TypeRef& ty) { + if( m_emitted_fn_types.count(ty) ) { + return ; + } + m_emitted_fn_types.insert(ty.clone()); + const auto& te = ty.m_data.as_Function(); m_of << "typedef "; // TODO: ABI marker, need an ABI enum? diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index fbf747f8..4e04ddf9 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -518,6 +518,11 @@ namespace { TU_MATCH_DEF(::HIR::TypeRef::Data, (ty.m_data), (te), ( ), + (Function, + visit_type(*te.m_rettype, Mode::Shallow); + for(const auto& sty : te.m_arg_types) + visit_type(sty, Mode::Shallow); + ), (Pointer, visit_type(*te.inner, Mode::Shallow); ), |