summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp6
-rw-r--r--src/trans/enumerate.cpp5
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);
),