summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/deserialise.cpp16
-rw-r--r--src/hir/expr.cpp1
-rw-r--r--src/hir/hir.hpp10
-rw-r--r--src/hir/path.cpp5
-rw-r--r--src/hir/path.hpp1
-rw-r--r--src/hir/serialise.cpp8
-rw-r--r--src/hir/visitor.cpp1
-rw-r--r--src/hir_conv/constant_evaluation.cpp7
-rw-r--r--src/hir_expand/vtable.cpp85
-rw-r--r--src/hir_typeck/common.cpp3
-rw-r--r--src/hir_typeck/expr_cs.cpp1
-rw-r--r--src/main.cpp1
-rw-r--r--src/mir/check.cpp4
-rw-r--r--src/mir/dump.cpp5
-rw-r--r--src/mir/from_hir.cpp74
-rw-r--r--src/mir/mir.cpp3
-rw-r--r--src/mir/mir.hpp4
-rw-r--r--src/mir/mir_builder.cpp9
-rw-r--r--src/trans/enumerate.cpp5
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);