diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/deserialise.cpp | 16 | ||||
-rw-r--r-- | src/hir/expr.cpp | 1 | ||||
-rw-r--r-- | src/hir/hir.hpp | 10 | ||||
-rw-r--r-- | src/hir/path.cpp | 5 | ||||
-rw-r--r-- | src/hir/path.hpp | 1 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 8 | ||||
-rw-r--r-- | src/hir/visitor.cpp | 1 | ||||
-rw-r--r-- | src/hir_conv/constant_evaluation.cpp | 7 | ||||
-rw-r--r-- | src/hir_expand/vtable.cpp | 85 | ||||
-rw-r--r-- | src/hir_typeck/common.cpp | 3 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 1 | ||||
-rw-r--r-- | src/main.cpp | 1 | ||||
-rw-r--r-- | src/mir/check.cpp | 4 | ||||
-rw-r--r-- | src/mir/dump.cpp | 5 | ||||
-rw-r--r-- | src/mir/from_hir.cpp | 74 | ||||
-rw-r--r-- | src/mir/mir.cpp | 3 | ||||
-rw-r--r-- | src/mir/mir.hpp | 4 | ||||
-rw-r--r-- | src/mir/mir_builder.cpp | 9 | ||||
-rw-r--r-- | src/trans/enumerate.cpp | 5 |
19 files changed, 201 insertions, 42 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp index 649d97fd..3d84c9d6 100644 --- a/src/hir/deserialise.cpp +++ b/src/hir/deserialise.cpp @@ -31,6 +31,7 @@ namespace { {} ::std::string read_string() { return m_in.read_string(); } + size_t deserialise_count() { return m_in.read_count(); } template<typename V> ::std::map< ::std::string,V> deserialise_strmap() @@ -359,6 +360,9 @@ namespace { _(DstMeta, { deserialise_mir_lvalue() }) + _(DstPtr, { + deserialise_mir_lvalue() + }) _(MakeDst, { deserialise_mir_lvalue(), deserialise_mir_lvalue() @@ -535,9 +539,12 @@ namespace { ::HIR::TraitValueItem deserialise_traitvalueitem() { - switch( m_in.read_tag() ) + auto tag = m_in.read_tag(); + auto idx = m_in.read_count(); + ::HIR::TraitValueItem rv; + switch( tag ) { - #define _(x, ...) case ::HIR::TraitValueItem::TAG_##x: DEBUG("- " #x); return ::HIR::TraitValueItem::make_##x( __VA_ARGS__ ); + #define _(x, ...) case ::HIR::TraitValueItem::TAG_##x: DEBUG("- " #x); rv = ::HIR::TraitValueItem::make_##x( __VA_ARGS__ ); break; _(Constant, deserialise_constant() ) _(Static, deserialise_static() ) _(Function, deserialise_function() ) @@ -546,6 +553,8 @@ namespace { DEBUG("Invalid TraitValueItem tag"); throw ""; } + rv.vtable_ofs = idx; + return rv; } ::HIR::AssociatedType deserialise_associatedtype() { @@ -602,6 +611,7 @@ namespace { template<> DEF_D( ::HIR::TypeImpl, return d.deserialise_typeimpl(); ) template<> DEF_D( ::MacroRulesPtr, return d.deserialise_macrorulesptr(); ) + template<> DEF_D( unsigned int, return static_cast<unsigned int>(d.deserialise_count()); ) ::HIR::TypeRef HirDeserialiser::deserialise_type() { @@ -722,7 +732,6 @@ namespace { box$( deserialise_type() ), deserialise_genericpath(), m_in.read_string(), - deserialise_pathparams(), deserialise_pathparams() } ); default: @@ -857,6 +866,7 @@ namespace { rv.m_is_marker = m_in.read_bool(); rv.m_types = deserialise_strumap< ::HIR::AssociatedType>(); rv.m_values = deserialise_strumap< ::HIR::TraitValueItem>(); + rv.m_type_indexes = deserialise_strumap< unsigned int>(); return rv; } diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index e974f2cc..51f0661f 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -320,7 +320,6 @@ void ::HIR::ExprVisitorDef::visit_path(::HIR::Visitor::PathContext pc, ::HIR::Pa visit_type(*e.type); visit_generic_path(pc, e.trait); visit_path_params(e.params); - visit_path_params(e.impl_params); ), (UfcsUnknown, visit_type(*e.type); diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp index 6843e93d..1a933993 100644 --- a/src/hir/hir.hpp +++ b/src/hir/hir.hpp @@ -231,10 +231,15 @@ struct AssociatedType ::std::vector< ::HIR::TraitPath> m_trait_bounds; ::HIR::TypeRef m_default; }; -TAGGED_UNION(TraitValueItem, Constant, +TAGGED_UNION_EX(TraitValueItem, (), Constant, ( (Constant, Constant), (Static, Static), (Function, Function) + ), + (),(), + ( + unsigned int vtable_ofs = ~0u; + ) ); struct Trait { @@ -247,6 +252,9 @@ struct Trait ::std::unordered_map< ::std::string, AssociatedType > m_types; ::std::unordered_map< ::std::string, TraitValueItem > m_values; + // Indexes in the parameter list for each associated type + ::std::unordered_map< ::std::string, unsigned int > m_type_indexes; + Trait( GenericParams gps, ::std::string lifetime, ::std::vector< ::HIR::TraitPath> parents): m_params( mv$(gps) ), m_lifetime( mv$(lifetime) ), diff --git a/src/hir/path.cpp b/src/hir/path.cpp index 1f80204d..73d1b92f 100644 --- a/src/hir/path.cpp +++ b/src/hir/path.cpp @@ -90,7 +90,7 @@ namespace HIR { return os << "<" << *e.type << " /*- " << e.impl_params << "*/>::" << e.item << e.params; ), (UfcsKnown, - return os << "<" << *e.type << " as " << e.trait << " /*- " << e.impl_params << "*/>::" << e.item << e.params; + return os << "<" << *e.type << " as " << e.trait << ">::" << e.item << e.params; ), (UfcsUnknown, return os << "<" << *e.type << " as _>::" << e.item << e.params; @@ -220,8 +220,7 @@ bool ::HIR::TraitPath::operator==(const ::HIR::TraitPath& x) const box$( e.type->clone() ), e.trait.clone(), e.item, - e.params.clone(), - e.impl_params.clone() + e.params.clone() })); ), (UfcsUnknown, diff --git a/src/hir/path.hpp b/src/hir/path.hpp index 4e8eaef3..e6b4e381 100644 --- a/src/hir/path.hpp +++ b/src/hir/path.hpp @@ -191,7 +191,6 @@ public: GenericPath trait; ::std::string item; PathParams params; - PathParams impl_params; }), (UfcsUnknown, struct { ::std::unique_ptr<TypeRef> type; diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp index d372585c..c58780a0 100644 --- a/src/hir/serialise.cpp +++ b/src/hir/serialise.cpp @@ -177,7 +177,6 @@ namespace { serialise_genericpath(e.trait); m_out.write_string(e.item); serialise_pathparams(e.params); - serialise_pathparams(e.impl_params); ), (UfcsUnknown, DEBUG("-- UfcsUnknown - " << path); @@ -565,6 +564,9 @@ namespace { (DstMeta, serialise(e.val); ), + (DstPtr, + serialise(e.val); + ), (MakeDst, serialise(e.ptr_val); serialise(e.meta_val); @@ -685,6 +687,8 @@ namespace { ) } + void serialise(unsigned int v) { m_out.write_count(v); }; + // - Value items void serialise(const ::HIR::Function& fcn) { @@ -813,10 +817,12 @@ namespace { m_out.write_bool( item.m_is_marker ); serialise_strmap( item.m_types ); serialise_strmap( item.m_values ); + serialise_strmap( item.m_type_indexes ); } void serialise(const ::HIR::TraitValueItem& tvi) { m_out.write_tag( tvi.tag() ); + m_out.write_count( tvi.vtable_ofs ); TU_MATCHA( (tvi), (e), (Constant, DEBUG("Constant"); diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp index d852423a..faa75e0a 100644 --- a/src/hir/visitor.cpp +++ b/src/hir/visitor.cpp @@ -450,7 +450,6 @@ void ::HIR::Visitor::visit_path(::HIR::Path& p, ::HIR::Visitor::PathContext pc) this->visit_type(*e.type); this->visit_generic_path(e.trait, ::HIR::Visitor::PathContext::TYPE); this->visit_path_params(e.params); - this->visit_path_params(e.impl_params); ), (UfcsUnknown, this->visit_type(*e.type); diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp index bd1e740a..058d018a 100644 --- a/src/hir_conv/constant_evaluation.cpp +++ b/src/hir_conv/constant_evaluation.cpp @@ -884,6 +884,8 @@ namespace { ::HIR::Literal evaluate_constant_mir(const Span& sp, const ::HIR::Crate& crate, NewvalState newval_state, const ::MIR::Function& fcn, ::std::vector< ::HIR::Literal> args) { + TRACE_FUNCTION; + ::HIR::Literal retval; ::std::vector< ::HIR::Literal> locals; ::std::vector< ::HIR::Literal> temps; @@ -1119,6 +1121,9 @@ namespace { (DstMeta, TODO(sp, "RValue::DstMeta"); ), + (DstPtr, + TODO(sp, "RValue::DstPtr"); + ), (MakeDst, TODO(sp, "RValue::MakeDst"); ), @@ -1197,7 +1202,7 @@ namespace { return evaluate_constant_mir(sp, crate, mv$(newval_state), *expr.m_mir, mv$(args)); } else { - BUG(sp, "Attempting to evaluate constant expression with code"); + BUG(sp, "Attempting to evaluate constant expression with no associated code"); } } diff --git a/src/hir_expand/vtable.cpp b/src/hir_expand/vtable.cpp index 41869397..5b4a8c39 100644 --- a/src/hir_expand/vtable.cpp +++ b/src/hir_expand/vtable.cpp @@ -46,10 +46,57 @@ namespace { void visit_trait(::HIR::ItemPath p, ::HIR::Trait& tr) override { + static Span sp; TRACE_FUNCTION_F(p); + ::HIR::GenericPath trait_path( p.get_simple_path() ); + { + unsigned int i = 0; + for(const auto& tp : tr.m_params.m_types) { + trait_path.m_params.m_types.push_back( ::HIR::TypeRef(tp.m_name, i) ); + i ++; + } + } + + ::std::unordered_map< ::std::string,unsigned int> assoc_type_indexes; + struct Foo { + ::HIR::Trait* trait_ptr; + unsigned int i; + void add_types_from_trait(const ::HIR::Trait& tr) { + for(const auto& ty : tr.m_types) { + trait_ptr->m_type_indexes[ty.first] = i; + i ++; + } + // TODO: Iterate supertraits too. + for(const auto& st : tr.m_parent_traits) { + add_types_from_trait(*st.m_trait_ptr); + } + } + }; + Foo { &tr, static_cast<unsigned int>(tr.m_params.m_types.size()) }.add_types_from_trait(tr); + + auto clone_cb = [&](const auto& t, auto& o) { + if(t.m_data.is_Path() && t.m_data.as_Path().path.m_data.is_UfcsKnown()) { + const auto& pe = t.m_data.as_Path().path.m_data.as_UfcsKnown(); + DEBUG("t=" << t); + if( *pe.type == ::HIR::TypeRef("Self", 0xFFFF) /*&& pe.trait == trait_path*/ ) { + // Replace with a new type param, need to know the index of it + o = ::HIR::TypeRef("a#"+pe.item, tr.m_type_indexes.at(pe.item)); + return true; + } + } + return false; + }; + auto clone_self_cb = [](const auto& t, auto&o) { + if( t == ::HIR::TypeRef("Self", 0xFFFF) ) { + o = ::HIR::TypeRef::new_unit(); + return true; + } + return false; + }; + ::HIR::t_struct_fields fields; - for(const auto& vi : tr.m_values) + for(auto& vi : tr.m_values) { TU_MATCHA( (vi.second), (ve), (Function, @@ -72,24 +119,22 @@ namespace { ::HIR::FunctionType ft; ft.is_unsafe = ve.m_unsafe; ft.m_abi = ve.m_abi; - ft.m_rettype = box$( ve.m_return.clone() ); - for(const auto& t : ve.m_args) - ft.m_arg_types.push_back( t.second.clone() ); - ft.m_arg_types[0] = ::HIR::TypeRef(); // Clear the first argument (the receiver) + ft.m_rettype = box$( clone_ty_with(sp, ve.m_return, clone_cb) ); + ft.m_arg_types.reserve( ve.m_args.size() ); + ft.m_arg_types.push_back( clone_ty_with(sp, ve.m_args[0].second, clone_self_cb) ); + for(unsigned int i = 1; i < ve.m_args.size(); i ++) + ft.m_arg_types.push_back( clone_ty_with(sp, ve.m_args[i].second, clone_cb) ); + // Clear the first argument (the receiver) ::HIR::TypeRef fcn_type( mv$(ft) ); - // Detect use of `Self` - if( visit_ty_with(fcn_type, [&](const auto& t){ - if( t == ::HIR::TypeRef("Self", 0xFFFF) ) - return true; - return false; - }) - ) + // Detect use of `Self` and don't create the vtable if there is. + if( visit_ty_with(fcn_type, [&](const auto& t){ return (t == ::HIR::TypeRef("Self", 0xFFFF)); }) ) { - DEBUG("- '" << vi.first << "' NOT object safe (Self), not creating vtable"); + DEBUG("- '" << vi.first << "' NOT object safe (Self), not creating vtable - " << fcn_type); return ; } + vi.second.vtable_ofs = fields.size(); fields.push_back( ::std::make_pair( vi.first, ::HIR::VisEnt< ::HIR::TypeRef> { true, mv$(fcn_type) } @@ -106,6 +151,20 @@ namespace { ::HIR::PathParams params; ::HIR::GenericParams args; + { + unsigned int i = 0; + for(const auto& tp : tr.m_params.m_types) { + args.m_types.push_back( ::HIR::TypeParamDef { tp.m_name, {}, tp.m_is_sized } ); + params.m_types.push_back( ::HIR::TypeRef(tp.m_name, i) ); + i ++; + } + for(const auto& ty : tr.m_types) { + args.m_types.push_back( ::HIR::TypeParamDef { "a#"+ty.first, {}, ty.second.is_sized } ); + ::HIR::Path path( ::HIR::TypeRef("Self",0xFFFF), trait_path.clone(), ty.first ); + params.m_types.push_back( ::HIR::TypeRef( mv$(path) ) ); + i ++; + } + } // TODO: Would like to have access to the publicity marker auto item_path = m_new_type(true, FMT(p.get_name() << "#vtable"), ::HIR::Struct { mv$(args), diff --git a/src/hir_typeck/common.cpp b/src/hir_typeck/common.cpp index 865604d8..ca6f6fe4 100644 --- a/src/hir_typeck/common.cpp +++ b/src/hir_typeck/common.cpp @@ -177,8 +177,7 @@ bool monomorphise_type_needed(const ::HIR::TypeRef& tpl) box$( clone_ty_with(sp, *e2.type, callback) ), clone_ty_with__generic_path(sp, e2.trait, callback), e2.item, - clone_ty_with__path_params(sp, e2.params, callback), - clone_ty_with__path_params(sp, e2.impl_params, callback) + clone_ty_with__path_params(sp, e2.params, callback) }); ), (UfcsUnknown, diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp index 22a30977..76426297 100644 --- a/src/hir_typeck/expr_cs.cpp +++ b/src/hir_typeck/expr_cs.cpp @@ -2985,7 +2985,6 @@ namespace { check_type_resolved(sp, *pe.type, top_type); check_type_resolved_pp(sp, pe.trait.m_params, top_type); check_type_resolved_pp(sp, pe.params, top_type); - check_type_resolved_pp(sp, pe.impl_params, top_type); ), (UfcsUnknown, ERROR(sp, E0000, "UfcsUnknown " << path << " left in " << top_type); diff --git a/src/main.cpp b/src/main.cpp index 23593abd..fdb1c7b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,6 +55,7 @@ void init_debug_list() g_debug_disable_map.insert( "Expand HIR Annotate" );
g_debug_disable_map.insert( "Expand HIR Closures" );
g_debug_disable_map.insert( "Expand HIR Calls" );
+ g_debug_disable_map.insert( "Expand HIR VTables" );
g_debug_disable_map.insert( "Expand HIR Reborrows" );
g_debug_disable_map.insert( "Expand HIR ErasedType" );
g_debug_disable_map.insert( "Typecheck Expressions (validate)" );
diff --git a/src/mir/check.cpp b/src/mir/check.cpp index 8c101041..89e75924 100644 --- a/src/mir/check.cpp +++ b/src/mir/check.cpp @@ -516,6 +516,10 @@ void MIR_Validate(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path // TODO: Ensure that the input type is a: Generic, Array, or DST // TODO: Check return type ), + (DstPtr, + // TODO: Ensure that the input type is a DST + // TODO: Check return type + ), (MakeDst, ), (Tuple, diff --git a/src/mir/dump.cpp b/src/mir/dump.cpp index 967bc98d..da9d0ea9 100644 --- a/src/mir/dump.cpp +++ b/src/mir/dump.cpp @@ -353,6 +353,11 @@ namespace { fmt_val(os, e.val); os << ")"; ), + (DstPtr, + os << "PTR("; + fmt_val(os, e.val); + os << ")"; + ), (MakeDst, os << "DST("; fmt_val(os, e.ptr_val); diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index 1edf7903..7ded3cb4 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -1351,6 +1351,7 @@ namespace { void visit(::HIR::ExprNode_CallPath& node) override { + const Span& sp = node.span(); TRACE_FUNCTION_F("_CallPath " << node.m_path); ::std::vector< ::MIR::LValue> values; values.reserve( node.m_args.size() ); @@ -1361,19 +1362,70 @@ namespace { m_builder.moved_lvalue( arg->span(), values.back() ); } - // TODO: Obtain function type for this function (i.e. a type that is specifically for this function) - auto fcn_ty_data = ::HIR::FunctionType { - false, - "", - box$( node.m_cache.m_arg_types.back().clone() ), - {} - }; - for(unsigned int i = 0; i < node.m_cache.m_arg_types.size() - 1; i ++) + ::MIR::LValue fcn_val; + + // If the call was to a TraitObject function, get it from the vtable. + bool was_virtual = false; + if( node.m_path.m_data.is_UfcsKnown() && node.m_path.m_data.as_UfcsKnown().type->m_data.is_TraitObject() ) { - fcn_ty_data.m_arg_types.push_back( node.m_cache.m_arg_types[i].clone() ); + const auto& pe = node.m_path.m_data.as_UfcsKnown(); + const auto& te = pe.type->m_data.as_TraitObject(); + if( pe.trait == te.m_trait.m_path ) + { + assert( te.m_trait.m_trait_ptr ); + const auto& trait = *te.m_trait.m_trait_ptr; + + // 1. Get the vtable index for this function + unsigned int vtable_idx = trait.m_values.at( pe.item ).vtable_ofs; + if( vtable_idx == ~0u ) { + BUG(sp, "Calling method '" << pe.item << "' of " << pe.trait << " which isn't in the vtable"); + } + + // 2. Load from the vtable + auto vtable_rval = ::MIR::RValue::make_DstMeta({ + ::MIR::LValue::make_Deref({ box$(values.front().clone()) }) + }); + auto vtable_ty_spath = pe.trait.m_path; + vtable_ty_spath.m_components.back() += "#vtable"; + const auto& vtable_ref = m_builder.crate().get_struct_by_path(sp, vtable_ty_spath); + // Copy the param set from the trait in the trait object + ::HIR::PathParams vtable_params = te.m_trait.m_path.m_params.clone(); + // - Include associated types on bound + for(const auto& ty_b : te.m_trait.m_type_bounds) { + auto idx = trait.m_type_indexes.at(ty_b.first); + if(vtable_params.m_types.size() <= idx) + vtable_params.m_types.resize(idx+1); + vtable_params.m_types[idx] = ty_b.second.clone(); + } + auto vtable_ty = ::HIR::TypeRef( ::HIR::GenericPath(vtable_ty_spath, mv$(vtable_params)), &vtable_ref ); + + auto vtable = m_builder.lvalue_or_temp(sp, mv$(vtable_ty), mv$(vtable_rval)); + auto vtable_fcn = ::MIR::LValue::make_Field({ box$(vtable), vtable_idx }); + m_builder.with_val_type(sp, vtable_fcn, [&](const auto& ty){ + fcn_val = m_builder.new_temporary(ty); + }); + + m_builder.push_stmt_assign( sp, fcn_val.clone(), ::MIR::RValue( mv$(vtable_fcn) ) ); + was_virtual = true; + } + } + + if( ! was_virtual ) + { + // TODO: Obtain function type for this function (i.e. a type that is specifically for this function) + auto fcn_ty_data = ::HIR::FunctionType { + false, + "", + box$( node.m_cache.m_arg_types.back().clone() ), + {} + }; + for(unsigned int i = 0; i < node.m_cache.m_arg_types.size() - 1; i ++) + { + fcn_ty_data.m_arg_types.push_back( node.m_cache.m_arg_types[i].clone() ); + } + fcn_val = m_builder.new_temporary( ::HIR::TypeRef(mv$(fcn_ty_data)) ); + m_builder.push_stmt_assign( sp, fcn_val.clone(), ::MIR::RValue::make_Constant( ::MIR::Constant(node.m_path.clone()) ) ); } - auto fcn_val = m_builder.new_temporary( ::HIR::TypeRef(mv$(fcn_ty_data)) ); - m_builder.push_stmt_assign( node.span(), fcn_val.clone(), ::MIR::RValue::make_Constant( ::MIR::Constant(node.m_path.clone()) ) ); auto panic_block = m_builder.new_bb_unlinked(); auto next_block = m_builder.new_bb_unlinked(); diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp index 0517111a..18c69a41 100644 --- a/src/mir/mir.cpp +++ b/src/mir/mir.cpp @@ -105,6 +105,9 @@ namespace MIR { (DstMeta, os << "DstMeta(" << e.val << ")"; ), + (DstPtr, + os << "DstPtr(" << e.val << ")"; + ), (MakeDst, os << "MakeDst(" << e.ptr_val << ", " << e.meta_val << ")"; ), diff --git a/src/mir/mir.hpp b/src/mir/mir.hpp index c0ee0d21..bf5e2d4a 100644 --- a/src/mir/mir.hpp +++ b/src/mir/mir.hpp @@ -130,6 +130,10 @@ TAGGED_UNION(RValue, Use, (DstMeta, struct { LValue val; }), + // Extract the pointer from a DST pointer (as *const ()) + (DstPtr, struct { + LValue val; + }), // Construct a DST pointer from a thin pointer and metadata (MakeDst, struct { LValue ptr_val; diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp index 202daac0..d539ef89 100644 --- a/src/mir/mir_builder.cpp +++ b/src/mir/mir_builder.cpp @@ -226,6 +226,9 @@ void MirBuilder::push_stmt_assign(const Span& sp, ::MIR::LValue dst, ::MIR::RVal (DstMeta, // Doesn't move ), + (DstPtr, + // Doesn't move + ), (MakeDst, // Doesn't move ptr_val this->moved_lvalue(sp, e.meta_val); @@ -741,7 +744,8 @@ void MirBuilder::with_val_type(const Span& sp, const ::MIR::LValue& val, ::std:: BUG(sp, "Field on unit-like struct - " << ty); ), (Tuple, - ASSERT_BUG(sp, e.field_index < se.size(), "Field index out of range in tuple-struct"); + ASSERT_BUG(sp, e.field_index < se.size(), + "Field index out of range in tuple-struct " << ty << " - " << e.field_index << " > " << se.size()); const auto& fld = se[e.field_index]; if( monomorphise_type_needed(fld.ent) ) { auto sty = monomorphise_type(sp, str.m_params, te.path.m_data.as_Generic().m_params, fld.ent); @@ -753,7 +757,8 @@ void MirBuilder::with_val_type(const Span& sp, const ::MIR::LValue& val, ::std:: } ), (Named, - ASSERT_BUG(sp, e.field_index < se.size(), "Field index out of range in struct"); + ASSERT_BUG(sp, e.field_index < se.size(), + "Field index out of range in struct " << ty << " - " << e.field_index << " > " << se.size()); const auto& fld = se[e.field_index].second; if( monomorphise_type_needed(fld.ent) ) { auto sty = monomorphise_type(sp, str.m_params, te.path.m_data.as_Generic().m_params, fld.ent); diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index 6598da55..5eab0bb9 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -275,7 +275,7 @@ void Trans_Enumerate_FillFrom_Path(TransList& out, const ::HIR::Crate& crate, co sub_pp = Trans_Params { sp, pe.m_params.clone() }; ), (UfcsKnown, - sub_pp = Trans_Params { sp, pe.params.clone(), pe.impl_params.clone(), pe.type->clone() }; + sub_pp = Trans_Params { sp, pe.params.clone(), {}, pe.type->clone() }; ), (UfcsInherent, sub_pp = Trans_Params { sp, pe.params.clone(), pe.impl_params.clone(), pe.type->clone() }; @@ -389,6 +389,9 @@ void Trans_Enumerate_FillFrom_MIR(TransList& out, const ::HIR::Crate& crate, con (DstMeta, Trans_Enumerate_FillFrom_MIR_LValue(out,crate, e.val, pp); ), + (DstPtr, + Trans_Enumerate_FillFrom_MIR_LValue(out,crate, e.val, pp); + ), (MakeDst, Trans_Enumerate_FillFrom_MIR_LValue(out,crate, e.ptr_val, pp); Trans_Enumerate_FillFrom_MIR_LValue(out,crate, e.meta_val, pp); |