summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-27 16:23:47 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-27 16:23:47 +0800
commitc738ac37629e6d4850431cd995739d1b198c97b1 (patch)
treea4c3102df98bab636cd80c940c7d09902579f8cc /src
parent261b3ec9ad093f6a595fa028bfde29c0ece8ad2f (diff)
downloadmrust-c738ac37629e6d4850431cd995739d1b198c97b1.tar.gz
HIR Deserialise - Fully fleshed?
Diffstat (limited to 'src')
-rw-r--r--src/hir/deserialise.cpp632
-rw-r--r--src/hir/serialise.cpp1
2 files changed, 336 insertions, 297 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp
index 7074dfa5..f68a44c1 100644
--- a/src/hir/deserialise.cpp
+++ b/src/hir/deserialise.cpp
@@ -170,6 +170,16 @@ namespace {
return rv;
}
template<typename T>
+ ::std::vector<T> deserialise_vec_c(::std::function<T()> cb)
+ {
+ size_t n = read_count();
+ ::std::vector<T> rv;
+ rv.reserve(n);
+ for(size_t i = 0; i < n; i ++)
+ rv.push_back( cb() );
+ return rv;
+ }
+ template<typename T>
::HIR::VisEnt<T> deserialise_visent()
{
return ::HIR::VisEnt<T> { read_bool(), D<T>::des(*this) };
@@ -194,128 +204,157 @@ namespace {
::HIR::Crate deserialise_crate();
::HIR::Module deserialise_module();
- #if 0
- void serialise_typeimpl(const ::HIR::TypeImpl& impl)
+
+ ::HIR::TypeImpl deserialise_typeimpl()
{
- TRACE_FUNCTION_F("impl" << impl.m_params.fmt_args() << " " << impl.m_type);
- serialise_generics(impl.m_params);
- serialise_type(impl.m_type);
+ ::HIR::TypeImpl rv;
+
+ rv.m_params = deserialise_genericparams();
+ rv.m_type = deserialise_type();
- write_count(impl.m_methods.size());
- for(const auto& v : impl.m_methods) {
- write_string(v.first);
- write_bool(v.second.is_pub);
- write_bool(v.second.is_specialisable);
- serialise(v.second.data);
+ size_t method_count = read_count();
+ for(size_t i = 0; i < method_count; i ++)
+ {
+ auto name = read_string();
+ rv.m_methods.insert( ::std::make_pair( mv$(name), ::HIR::TypeImpl::VisImplEnt< ::HIR::Function> {
+ read_bool(), read_bool(), deserialise_function()
+ } ) );
}
// m_src_module doesn't matter after typeck
+ TRACE_FUNCTION_F("impl" << rv.m_params.fmt_args() << " " << rv.m_type);
+ return rv;
}
- void serialise_traitimpl(const ::HIR::TraitImpl& impl)
+ ::HIR::TraitImpl deserialise_traitimpl()
{
- TRACE_FUNCTION_F("impl" << impl.m_params.fmt_args() << " ?" << impl.m_trait_args << " for " << impl.m_type);
- serialise_generics(impl.m_params);
- serialise_pathparams(impl.m_trait_args);
- serialise_type(impl.m_type);
+ ::HIR::TraitImpl rv;
- write_count(impl.m_methods.size());
- for(const auto& v : impl.m_methods) {
- DEBUG("fn " << v.first);
- write_string(v.first);
- write_bool(v.second.is_specialisable);
- serialise(v.second.data);
+ rv.m_params = deserialise_genericparams();
+ rv.m_trait_args = deserialise_pathparams();
+ rv.m_type = deserialise_type();
+
+
+ size_t method_count = read_count();
+ for(size_t i = 0; i < method_count; i ++)
+ {
+ auto name = read_string();
+ rv.m_methods.insert( ::std::make_pair( mv$(name), ::HIR::TraitImpl::ImplEnt< ::HIR::Function> {
+ read_bool(), deserialise_function()
+ } ) );
}
- write_count(impl.m_constants.size());
- for(const auto& v : impl.m_constants) {
- DEBUG("const " << v.first);
- write_string(v.first);
- write_bool(v.second.is_specialisable);
- serialise(v.second.data);
+ size_t const_count = read_count();
+ for(size_t i = 0; i < const_count; i ++)
+ {
+ auto name = read_string();
+ rv.m_constants.insert( ::std::make_pair( mv$(name), ::HIR::TraitImpl::ImplEnt< ::HIR::ExprPtr> {
+ read_bool(), deserialise_exprptr()
+ } ) );
}
- write_count(impl.m_types.size());
- for(const auto& v : impl.m_types) {
- DEBUG("type " << v.first);
- write_string(v.first);
- write_bool(v.second.is_specialisable);
- serialise(v.second.data);
+ size_t type_count = read_count();
+ for(size_t i = 0; i < type_count; i ++)
+ {
+ auto name = read_string();
+ rv.m_types.insert( ::std::make_pair( mv$(name), ::HIR::TraitImpl::ImplEnt< ::HIR::TypeRef> {
+ read_bool(), deserialise_type()
+ } ) );
}
+
// m_src_module doesn't matter after typeck
+ TRACE_FUNCTION_F("impl" << rv.m_params.fmt_args() << " ?" << rv.m_trait_args << " for " << rv.m_type);
+ return rv;
}
- void serialise_markerimpl(const ::HIR::MarkerImpl& impl)
+ ::HIR::MarkerImpl deserialise_markerimpl()
{
- serialise_generics(impl.m_params);
- serialise_pathparams(impl.m_trait_args);
- serialise_type(impl.m_type);
+ return ::HIR::MarkerImpl {
+ deserialise_genericparams(),
+ deserialise_pathparams(),
+ read_bool(),
+ deserialise_type()
+ };
}
- void serialise(const ::HIR::TypeRef& ty) {
- serialise_type(ty);
+ ::MacroRules deserialise_macrorules()
+ {
+ ::MacroRules rv;
+ rv.m_exported = true;
+ rv.m_pattern = deserialise_macropatfrag();
+ rv.m_rules = deserialise_vec_c< ::MacroRulesArm>( [&](){ return deserialise_macrorulesarm(); });
+ return rv;
}
- void serialise(const ::HIR::SimplePath& p) {
- serialise_simplepath(p);
+ ::MacroRulesPatFrag deserialise_macropatfrag() {
+ ::MacroRulesPatFrag rv;
+ rv.m_pats_ents = deserialise_vec_c< ::MacroPatEnt>([&](){ return deserialise_macropatent(); });
+ rv.m_pattern_end = read_count();
+ rv.m_next_frags = deserialise_vec_c< ::MacroRulesPatFrag>([&](){ return deserialise_macropatfrag(); });
+ return rv;
}
- void serialise(const ::HIR::TraitPath& p) {
- serialise_traitpath(p);
+ ::MacroPatEnt deserialise_macropatent() {
+ ::MacroPatEnt rv { read_string(), static_cast<unsigned int>(read_count()), static_cast< ::MacroPatEnt::Type>(read_tag()) };
+ switch(rv.type)
+ {
+ case ::MacroPatEnt::PAT_TOKEN:
+ rv.tok = deserialise_token();
+ break;
+ case ::MacroPatEnt::PAT_LOOP:
+ rv.subpats = deserialise_vec_c< ::MacroPatEnt>([&](){ return deserialise_macropatent(); });
+ break;
+ case ::MacroPatEnt::PAT_TT: // :tt
+ case ::MacroPatEnt::PAT_PAT: // :pat
+ case ::MacroPatEnt::PAT_IDENT:
+ case ::MacroPatEnt::PAT_PATH:
+ case ::MacroPatEnt::PAT_TYPE:
+ case ::MacroPatEnt::PAT_EXPR:
+ case ::MacroPatEnt::PAT_STMT:
+ case ::MacroPatEnt::PAT_BLOCK:
+ case ::MacroPatEnt::PAT_META:
+ break;
+ default:
+ throw "";
+ }
+ return rv;
}
- void serialise(const ::std::string& v) {
- write_string(v);
+ ::MacroRulesArm deserialise_macrorulesarm() {
+ ::MacroRulesArm rv;
+ rv.m_param_names = deserialise_vec< ::std::string>();
+ rv.m_contents = deserialise_vec_c< ::MacroExpansionEnt>( [&](){ return deserialise_macroexpansionent(); } );
+ return rv;
}
-
- void serialise(const ::MacroRules& mac)
- {
- //m_exported: IGNORE, should be set
- serialise(mac.m_pattern);
- serialise_vec(mac.m_rules);
- }
- void serialise(const ::MacroRulesPatFrag& pat) {
- serialise_vec(pat.m_pats_ents);
- write_count(pat.m_pattern_end);
- serialise_vec(pat.m_next_frags);
- }
- void serialise(const ::MacroPatEnt& pe) {
- write_string(pe.name);
- write_count(pe.name_index);
- serialise(pe.tok);
- serialise_vec(pe.subpats);
- write_tag( static_cast<int>(pe.type) );
- }
- void serialise(const ::MacroRulesArm& arm) {
- serialise_vec(arm.m_param_names);
- serialise_vec(arm.m_contents);
- }
- void serialise(const ::MacroExpansionEnt& ent) {
- TU_MATCHA( (ent), (e),
- (Token,
- write_tag(0);
- serialise(e);
- ),
- (NamedValue,
- write_tag(1);
- write_u8(e >> 24);
- write_count(e & 0x00FFFFFF);
- ),
- (Loop,
- write_tag(2);
- serialise_vec(e.entries);
- serialise(e.joiner);
- // ::std::set<unsigned int>
- write_count(e.variables.size());
- for(const auto& var : e.variables)
- write_count(var);
- )
- )
+ ::MacroExpansionEnt deserialise_macroexpansionent() {
+ switch(read_tag())
+ {
+ case 0:
+ return ::MacroExpansionEnt( deserialise_token() );
+ case 1: {
+ unsigned int v = static_cast<unsigned int>(read_u8()) << 24;
+ return ::MacroExpansionEnt( v | read_count() );
+ }
+ case 2: {
+ auto entries = deserialise_vec_c< ::MacroExpansionEnt>( [&](){ return deserialise_macroexpansionent(); } );
+ auto joiner = deserialise_token();
+ ::std::set<unsigned int> variables;
+ size_t n = read_count();
+ while(n--)
+ variables.insert( static_cast<unsigned int>(read_count()) );
+ return ::MacroExpansionEnt::make_Loop({
+ mv$(entries), mv$(joiner), mv$(variables)
+ });
+ }
+ default:
+ throw "";
+ }
}
- void serialise(const ::Token& tok) {
+
+ ::Token deserialise_token() {
+ ::Token tok;
// HACK: Hand off to old serialiser code
- ::std::stringstream tmp;
+ auto s = read_string();
+ ::std::stringstream tmp(s);
{
- Serialiser_TextTree ser(tmp);
- tok.serialise( ser );
+ Deserialiser_TextTree ser(tmp);
+ tok.deserialise( ser );
}
-
- write_string(tmp.str());
+ return tok;
}
-
- #endif
+
::HIR::Literal deserialise_literal();
::HIR::ExprPtr deserialise_exprptr()
@@ -328,191 +367,113 @@ namespace {
}
return rv;
}
- ::MIR::FunctionPointer deserialise_mir()
- {
- ::MIR::Function rv;
- rv.named_variables = deserialise_vec< ::HIR::TypeRef>( );
- rv.temporaries = deserialise_vec< ::HIR::TypeRef>( );
- //rv.blocks = deserialise_vec< ::MIR::BasicBlock>( );
- return ::MIR::FunctionPointer( new ::MIR::Function(mv$(rv)) );
- }
- #if 0
- void serialise(const ::MIR::BasicBlock& block)
- {
- serialise_vec( block.statements );
- serialise(block.terminator);
- }
- void serialise(const ::MIR::Statement& stmt)
- {
- TU_MATCHA( (stmt), (e),
- (Assign,
- write_tag(0);
- serialise(e.dst);
- serialise(e.src);
- ),
- (Drop,
- write_tag(1);
- assert(e.kind == ::MIR::eDropKind::DEEP);
- serialise(e.slot);
- )
- )
- }
- void serialise(const ::MIR::Terminator& term)
- {
- write_tag( static_cast<int>(term.tag()) );
- TU_MATCHA( (term), (e),
- (Incomplete,
- // NOTE: loops that diverge (don't break) leave a dangling bb
- //assert(!"Entountered Incomplete MIR block");
- ),
- (Return,
- ),
- (Diverge,
- ),
- (Goto,
- write_count(e);
- ),
- (Panic,
- write_count(e.dst);
- ),
- (If,
- serialise(e.cond);
- write_count(e.bb0);
- write_count(e.bb1);
- ),
- (Switch,
- serialise(e.val);
- write_count(e.targets.size());
- for(auto t : e.targets)
- write_count(t);
- ),
- (Call,
- write_count(e.ret_block);
- write_count(e.panic_block);
- serialise(e.ret_val);
- serialise(e.fcn_val);
- serialise_vec(e.args);
- )
- )
- }
- void serialise(const ::MIR::LValue& lv)
- {
- write_tag( static_cast<int>(lv.tag()) );
- TU_MATCHA( (lv), (e),
- (Variable,
- write_count(e);
- ),
- (Temporary,
- write_count(e.idx);
- ),
- (Argument,
- write_count(e.idx);
- ),
- (Static,
- serialise_path(e);
- ),
- (Return,
- ),
- (Field,
- serialise(e.val);
- write_count(e.field_index);
- ),
- (Deref,
- serialise(e.val);
- ),
- (Index,
- serialise(e.val);
- serialise(e.idx);
- ),
- (Downcast,
- serialise(e.val);
- write_count(e.variant_index);
- )
- )
+ ::MIR::FunctionPointer deserialise_mir();
+ ::MIR::BasicBlock deserialise_mir_basicblock();
+ ::MIR::Statement deserialise_mir_statement();
+ ::MIR::Terminator deserialise_mir_terminator();
+
+ ::MIR::LValue deserialise_mir_lvalue()
+ {
+ switch( read_tag() )
+ {
+ #define _(x, ...) case ::MIR::LValue::TAG_##x: return ::MIR::LValue::make_##x( __VA_ARGS__ );
+ _(Variable, static_cast<unsigned int>(read_count()) )
+ _(Temporary, { static_cast<unsigned int>(read_count()) } )
+ _(Argument, { static_cast<unsigned int>(read_count()) } )
+ _(Static, deserialise_path() )
+ _(Return, {})
+ _(Field, {
+ box$( deserialise_mir_lvalue() ),
+ static_cast<unsigned int>(read_count())
+ } )
+ _(Deref, { box$( deserialise_mir_lvalue() ) })
+ _(Index, {
+ box$( deserialise_mir_lvalue() ),
+ box$( deserialise_mir_lvalue() )
+ } )
+ _(Downcast, {
+ box$( deserialise_mir_lvalue() ),
+ static_cast<unsigned int>(read_count())
+ } )
+ #undef _
+ default:
+ throw "";
+ }
}
- void serialise(const ::MIR::RValue& val)
- {
- write_tag( val.tag() );
- TU_MATCHA( (val), (e),
- (Use,
- serialise(e);
- ),
- (Constant,
- serialise(e);
- ),
- (SizedArray,
- serialise(e.val);
- write_u64c(e.count);
- ),
- (Borrow,
- // TODO: Region?
- write_tag( static_cast<int>(e.type) );
- serialise(e.val);
- ),
- (Cast,
- serialise(e.val);
- serialise(e.type);
- ),
- (BinOp,
- serialise(e.val_l);
- write_tag( static_cast<int>(e.op) );
- serialise(e.val_r);
- ),
- (UniOp,
- serialise(e.val);
- write_tag( static_cast<int>(e.op) );
- ),
- (DstMeta,
- serialise(e.val);
- ),
- (MakeDst,
- serialise(e.ptr_val);
- serialise(e.meta_val);
- ),
- (Tuple,
- serialise_vec(e.vals);
- ),
- (Array,
- serialise_vec(e.vals);
- ),
- (Struct,
- serialise_genericpath(e.path);
- serialise_vec(e.vals);
- )
- )
+ ::MIR::RValue deserialise_mir_rvalue()
+ {
+ switch( read_tag() )
+ {
+ #define _(x, ...) case ::MIR::RValue::TAG_##x: return ::MIR::RValue::make_##x( __VA_ARGS__ );
+ _(Use, deserialise_mir_lvalue() )
+ _(Constant, deserialise_mir_constant() )
+ _(SizedArray, {
+ deserialise_mir_lvalue(),
+ static_cast<unsigned int>(read_u64c())
+ })
+ _(Borrow, {
+ 0, // TODO: Region?
+ static_cast< ::HIR::BorrowType>( read_tag() ),
+ deserialise_mir_lvalue()
+ })
+ _(Cast, {
+ deserialise_mir_lvalue(),
+ deserialise_type()
+ })
+ _(BinOp, {
+ deserialise_mir_lvalue(),
+ static_cast< ::MIR::eBinOp>( read_tag() ),
+ deserialise_mir_lvalue()
+ })
+ _(UniOp, {
+ deserialise_mir_lvalue(),
+ static_cast< ::MIR::eUniOp>( read_tag() )
+ })
+ _(DstMeta, {
+ deserialise_mir_lvalue()
+ })
+ _(MakeDst, {
+ deserialise_mir_lvalue(),
+ deserialise_mir_lvalue()
+ })
+ _(Tuple, {
+ deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ })
+ _(Array, {
+ deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ })
+ _(Struct, {
+ deserialise_genericpath(),
+ deserialise_vec_c< ::MIR::LValue>([&](){ return deserialise_mir_lvalue(); })
+ })
+ #undef _
+ default:
+ throw "";
+ }
}
- void serialise(const ::MIR::Constant& v)
- {
- write_tag(v.tag());
- TU_MATCHA( (v), (e),
- (Int,
- write_i64c(e);
- ),
- (Uint,
- write_u64c(e);
- ),
- (Float,
- write_double(e);
- ),
- (Bool,
- write_bool(e);
- ),
- (Bytes,
- write_count(e.size());
- m_os.write( reinterpret_cast<const char*>(e.data()), e.size() );
- ),
- (StaticString,
- write_string(e);
- ),
- (Const,
- serialise_path(e.p);
- ),
- (ItemAddr,
- serialise_path(e);
- )
- )
+ ::MIR::Constant deserialise_mir_constant()
+ {
+ switch( read_tag() )
+ {
+ #define _(x, ...) case ::MIR::Constant::TAG_##x: return ::MIR::Constant::make_##x( __VA_ARGS__ );
+ _(Int, read_i64c())
+ _(Uint, read_u64c())
+ _(Float, read_double())
+ _(Bool, read_bool())
+ case ::MIR::Constant::TAG_Bytes: {
+ ::std::vector<unsigned char> bytes;
+ bytes.resize( read_count() );
+ m_is.read( reinterpret_cast<char*>(bytes.data()), bytes.size() );
+ return ::MIR::Constant::make_Bytes( mv$(bytes) );
+ }
+ _(StaticString, read_string() )
+ _(Const, { deserialise_path() } )
+ _(ItemAddr, deserialise_path() )
+ #undef _
+ default:
+ throw "";
+ }
}
- #endif
::HIR::TypeItem deserialise_typeitem()
{
@@ -656,6 +617,7 @@ namespace {
return d.deserialise_visent<T>(); )
template<> DEF_D( ::HIR::TypeRef, return d.deserialise_type(); )
+ template<> DEF_D( ::HIR::SimplePath, return d.deserialise_simplepath(); )
template<> DEF_D( ::HIR::GenericPath, return d.deserialise_genericpath(); )
template<> DEF_D( ::HIR::TraitPath, return d.deserialise_traitpath(); )
@@ -671,6 +633,12 @@ namespace {
template<> DEF_D( ::HIR::AssociatedType, return d.deserialise_associatedtype(); )
template<> DEF_D( ::HIR::TraitValueItem, return d.deserialise_traitvalueitem(); )
+ template<> DEF_D( ::MIR::LValue, return d.deserialise_mir_lvalue(); )
+ template<> DEF_D( ::MIR::Statement, return d.deserialise_mir_statement(); )
+
+ template<> DEF_D( ::HIR::TypeImpl, return d.deserialise_typeimpl(); )
+ template<> DEF_D( ::MacroRules, return d.deserialise_macrorules(); )
+
::HIR::TypeRef HirDeserialiser::deserialise_type()
{
switch( read_tag() )
@@ -896,6 +864,71 @@ namespace {
}
}
+ ::MIR::FunctionPointer HirDeserialiser::deserialise_mir()
+ {
+ ::MIR::Function rv;
+ rv.named_variables = deserialise_vec< ::HIR::TypeRef>( );
+ rv.temporaries = deserialise_vec< ::HIR::TypeRef>( );
+ //rv.blocks = deserialise_vec< ::MIR::BasicBlock>( );
+ return ::MIR::FunctionPointer( new ::MIR::Function(mv$(rv)) );
+ }
+ ::MIR::BasicBlock HirDeserialiser::deserialise_mir_basicblock()
+ {
+ return ::MIR::BasicBlock {
+ deserialise_vec< ::MIR::Statement>(),
+ deserialise_mir_terminator()
+ };
+ }
+ ::MIR::Statement HirDeserialiser::deserialise_mir_statement()
+ {
+ switch( read_tag() )
+ {
+ case 0:
+ return ::MIR::Statement::make_Assign({
+ deserialise_mir_lvalue(),
+ deserialise_mir_rvalue()
+ });
+ case 1:
+ return ::MIR::Statement::make_Drop({
+ ::MIR::eDropKind::DEEP,
+ deserialise_mir_lvalue()
+ });
+ default:
+ throw "";
+ }
+ }
+ ::MIR::Terminator HirDeserialiser::deserialise_mir_terminator()
+ {
+ switch( read_tag() )
+ {
+ #define _(x, ...) case ::MIR::Terminator::TAG_##x: return ::MIR::Terminator::make_##x( __VA_ARGS__ );
+ _(Incomplete, {})
+ _(Return, {})
+ _(Diverge, {})
+ _(Goto, static_cast<unsigned int>(read_count()) )
+ _(Panic, { static_cast<unsigned int>(read_count()) })
+ _(If, {
+ deserialise_mir_lvalue(),
+ static_cast<unsigned int>(read_count()),
+ static_cast<unsigned int>(read_count())
+ })
+ _(Switch, {
+ deserialise_mir_lvalue(),
+ deserialise_vec_c<unsigned int>([&](){ return read_count(); })
+ })
+ _(Call, {
+ static_cast<unsigned int>(read_count()),
+ static_cast<unsigned int>(read_count()),
+ deserialise_mir_lvalue(),
+ deserialise_mir_lvalue(),
+ deserialise_vec< ::MIR::LValue>()
+ })
+ #undef _
+ default:
+ throw "";
+ }
+ }
+
::HIR::Module HirDeserialiser::deserialise_module()
{
TRACE_FUNCTION;
@@ -914,23 +947,28 @@ namespace {
rv.m_root_module = deserialise_module();
- //write_count(crate.m_type_impls.size());
- //for(const auto& impl : crate.m_type_impls) {
- // serialise_typeimpl(impl);
- //}
- //write_count(crate.m_trait_impls.size());
- //for(const auto& tr_impl : crate.m_trait_impls) {
- // serialise_simplepath(tr_impl.first);
- // serialise_traitimpl(tr_impl.second);
- //}
- //write_count(crate.m_marker_impls.size());
- //for(const auto& tr_impl : crate.m_marker_impls) {
- // serialise_simplepath(tr_impl.first);
- // serialise_markerimpl(tr_impl.second);
- //}
- //
- //serialise_strmap(crate.m_exported_macros);
- //serialise_strmap(crate.m_lang_items);
+ rv.m_type_impls = deserialise_vec< ::HIR::TypeImpl>();
+
+ {
+ size_t n = read_count();
+ for(size_t i = 0; i < n; i ++)
+ {
+ auto p = deserialise_simplepath();
+ rv.m_trait_impls.insert( ::std::make_pair( mv$(p), deserialise_traitimpl() ) );
+ }
+ }
+ {
+ size_t n = read_count();
+ for(size_t i = 0; i < n; i ++)
+ {
+ auto p = deserialise_simplepath();
+ rv.m_marker_impls.insert( ::std::make_pair( mv$(p), deserialise_markerimpl() ) );
+ }
+ }
+
+ rv.m_exported_macros = deserialise_strumap< ::MacroRules>();
+ rv.m_lang_items = deserialise_strumap< ::HIR::SimplePath>();
+
return rv;
}
}
diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp
index 233be0ba..9ef9d19f 100644
--- a/src/hir/serialise.cpp
+++ b/src/hir/serialise.cpp
@@ -377,6 +377,7 @@ namespace {
{
serialise_generics(impl.m_params);
serialise_pathparams(impl.m_trait_args);
+ write_bool(impl.is_positive);
serialise_type(impl.m_type);
}