summaryrefslogtreecommitdiff
path: root/src/mir/cleanup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/cleanup.cpp')
-rw-r--r--src/mir/cleanup.cpp47
1 files changed, 29 insertions, 18 deletions
diff --git a/src/mir/cleanup.cpp b/src/mir/cleanup.cpp
index 53d1c17b..c9dba9bd 100644
--- a/src/mir/cleanup.cpp
+++ b/src/mir/cleanup.cpp
@@ -207,7 +207,7 @@ const ::HIR::Literal* MIR_Cleanup_GetConstant(const Span& sp, const StaticTraitR
const auto& vals = lit.as_List();
MIR_ASSERT(state, vals.size() == te.size(), "Literal size mismatched with tuple size");
- ::std::vector< ::MIR::LValue> lvals;
+ ::std::vector< ::MIR::Param> lvals;
lvals.reserve( vals.size() );
for(unsigned int i = 0; i < vals.size(); i ++)
@@ -245,7 +245,7 @@ const ::HIR::Literal* MIR_Cleanup_GetConstant(const Span& sp, const StaticTraitR
}
else
{
- ::std::vector< ::MIR::LValue> lvals;
+ ::std::vector< ::MIR::Param> lvals;
lvals.reserve( vals.size() );
for(const auto& val: vals)
@@ -265,7 +265,7 @@ const ::HIR::Literal* MIR_Cleanup_GetConstant(const Span& sp, const StaticTraitR
auto monomorph = [&](const auto& tpl) { return monomorphise_type(state.sp, str.m_params, te.path.m_data.as_Generic().m_params, tpl); };
- ::std::vector< ::MIR::LValue> lvals;
+ ::std::vector< ::MIR::Param> lvals;
TU_MATCHA( (str.m_data), (se),
(Unit,
MIR_ASSERT(state, vals.size() == 0, "Values passed for unit struct");
@@ -298,7 +298,7 @@ const ::HIR::Literal* MIR_Cleanup_GetConstant(const Span& sp, const StaticTraitR
auto monomorph = [&](const auto& tpl) { return monomorphise_type(state.sp, enm.m_params, te.path.m_data.as_Generic().m_params, tpl); };
- ::std::vector< ::MIR::LValue> lvals;
+ ::std::vector< ::MIR::Param> lvals;
MIR_ASSERT(state, lit_var.idx < enm.m_variants.size(), "Variant index out of range");
TU_MATCHA( (enm.m_variants[lit_var.idx].second), (ve),
(Unit,
@@ -487,7 +487,7 @@ const ::HIR::Literal* MIR_Cleanup_GetConstant(const Span& sp, const StaticTraitR
const auto& str = *te.binding.as_Struct();
::HIR::TypeRef tmp;
auto monomorph = [&](const auto& t) { return monomorphise_type(Span(), str.m_params, ty_path.m_params, t); };
- ::std::vector< ::MIR::LValue> vals;
+ ::std::vector< ::MIR::Param> vals;
TU_MATCHA( (str.m_data), (se),
(Unit,
),
@@ -732,7 +732,7 @@ bool MIR_Cleanup_Unsize_GetMetadata(const ::MIR::TypeResolve& state, MirMutator&
auto monomorph_cb_s = monomorphise_type_get_cb(state.sp, nullptr, &ste.path.m_data.as_Generic().m_params, nullptr);
// - Destructure and restrucure with the unsized fields
- ::std::vector<::MIR::LValue> ents;
+ ::std::vector<::MIR::Param> ents;
TU_MATCHA( (str.m_data), (se),
(Unit,
MIR_BUG(state, "Unit-like struct CoerceUnsized is impossible - " << src_ty);
@@ -904,6 +904,17 @@ void MIR_Cleanup_LValue(const ::MIR::TypeResolve& state, MirMutator& mutator, ::
}
}
}
+void MIR_Cleanup_Param(const ::MIR::TypeResolve& state, MirMutator& mutator, ::MIR::Param& p)
+{
+ TU_MATCHA( (p), (e),
+ (LValue,
+ MIR_Cleanup_LValue(state, mutator, e);
+ ),
+ (Constant,
+ // NOTE: No cleanup
+ )
+ )
+}
void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path, ::MIR::Function& fcn, const ::HIR::Function::args_t& args, const ::HIR::TypeRef& ret_type)
{
@@ -941,7 +952,7 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
(Constant,
),
(SizedArray,
- MIR_Cleanup_LValue(state, mutator, re.val);
+ MIR_Cleanup_Param(state, mutator, re.val);
),
(Borrow,
MIR_Cleanup_LValue(state, mutator, re.val);
@@ -950,8 +961,8 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
MIR_Cleanup_LValue(state, mutator, re.val);
),
(BinOp,
- MIR_Cleanup_LValue(state, mutator, re.val_l);
- MIR_Cleanup_LValue(state, mutator, re.val_r);
+ MIR_Cleanup_Param(state, mutator, re.val_l);
+ MIR_Cleanup_Param(state, mutator, re.val_r);
),
(UniOp,
MIR_Cleanup_LValue(state, mutator, re.val);
@@ -987,22 +998,22 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
),
(MakeDst,
MIR_Cleanup_LValue(state, mutator, re.ptr_val);
- MIR_Cleanup_LValue(state, mutator, re.meta_val);
+ MIR_Cleanup_Param(state, mutator, re.meta_val);
),
(Tuple,
for(auto& lv : re.vals)
- MIR_Cleanup_LValue(state, mutator, lv);
+ MIR_Cleanup_Param(state, mutator, lv);
),
(Array,
for(auto& lv : re.vals)
- MIR_Cleanup_LValue(state, mutator, lv);
+ MIR_Cleanup_Param(state, mutator, lv);
),
(Variant,
- MIR_Cleanup_LValue(state, mutator, re.val);
+ MIR_Cleanup_Param(state, mutator, re.val);
),
(Struct,
for(auto& lv : re.vals)
- MIR_Cleanup_LValue(state, mutator, lv);
+ MIR_Cleanup_Param(state, mutator, lv);
)
)
)
@@ -1103,7 +1114,7 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
MIR_Cleanup_LValue(state, mutator, e.fcn.as_Value());
}
for(auto& lv : e.args)
- MIR_Cleanup_LValue(state, mutator, lv);
+ MIR_Cleanup_Param(state, mutator, lv);
)
)
@@ -1125,7 +1136,7 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
)
)
{
- auto tgt_lvalue = MIR_Cleanup_Virtualize(sp, state, mutator, e.args.front(), te, pe);
+ auto tgt_lvalue = MIR_Cleanup_Virtualize(sp, state, mutator, e.args.front().as_LValue(), te, pe);
e.fcn = mv$(tgt_lvalue);
}
}
@@ -1137,8 +1148,8 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path,
if( pe.trait.m_path == resolve.m_lang_Fn || pe.trait.m_path == resolve.m_lang_FnMut || pe.trait.m_path == resolve.m_lang_FnOnce )
{
MIR_ASSERT(state, e.args.size() == 2, "Fn* call requires two arguments");
- auto fcn_lvalue = mv$(e.args[0]);
- auto args_lvalue = mv$(e.args[1]);
+ auto fcn_lvalue = mv$(e.args[0].as_LValue());
+ auto args_lvalue = mv$(e.args[1].as_LValue());
DEBUG("Convert function pointer call");