summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mir/from_hir.cpp8
-rw-r--r--src/mir/from_hir.hpp19
-rw-r--r--src/mir/from_hir_match.cpp8
-rw-r--r--src/mir/mir_builder.cpp2
4 files changed, 20 insertions, 17 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 40b5a848..9f44df41 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -547,7 +547,9 @@ namespace {
target_block = &*it;
}
- // TODO: Insert drop of all active scopes within the loop
+ // TODO: Add the current variable state (of variables above the loop scope) to the loop scope
+ // - Allowing the state after the loop is complete to be known.
+
m_builder.terminate_scope_early( node.span(), target_block->scope );
if( node.m_continue ) {
m_builder.end_block( ::MIR::Terminator::make_Goto(target_block->cur) );
@@ -1461,7 +1463,7 @@ namespace {
for(auto& arg : node.m_args)
{
this->visit_node_ptr(arg);
-
+
if( node.m_args.size() == 1 )
{
values.push_back( m_builder.get_result_in_lvalue(arg->span(), arg->m_res_type) );
@@ -1473,7 +1475,7 @@ namespace {
m_builder.push_stmt_assign( arg->span(), tmp.clone(), m_builder.get_result(arg->span()) );
values.push_back( mv$(tmp) );
}
-
+
m_builder.moved_lvalue( arg->span(), values.back() );
}
diff --git a/src/mir/from_hir.hpp b/src/mir/from_hir.hpp
index aae19d97..b89e8750 100644
--- a/src/mir/from_hir.hpp
+++ b/src/mir/from_hir.hpp
@@ -46,15 +46,15 @@ enum class InvalidType {
Descoped,
};
TAGGED_UNION(VarState, Uninit,
-// Currently invalid
-(Invalid, InvalidType),
-// Partially valid (Map of field states, Box is assumed to have one field)
-(Partial, ::std::vector<VarState>),
-// Optionally valid (integer indicates the drop flag index)
-(Optional, unsigned int),
-// Fully valid
-(Valid, struct {}),
-)
+ // Currently invalid
+ (Invalid, InvalidType),
+ // Partially valid (Map of field states, Box is assumed to have one field)
+ (Partial, ::std::vector<VarState>),
+ // Optionally valid (integer indicates the drop flag index)
+ (Optional, unsigned int),
+ // Fully valid
+ (Valid, struct {}),
+ )
#endif
// TODO: Replace the first three states with just one (and flags for init/moved)
@@ -91,6 +91,7 @@ TAGGED_UNION(ScopeType, Variables,
::std::vector<SplitArm> arms;
}),
(Loop, struct {
+ ::std::vector<SplitArm> exit_states;
})
);
diff --git a/src/mir/from_hir_match.cpp b/src/mir/from_hir_match.cpp
index a8752a73..183d6418 100644
--- a/src/mir/from_hir_match.cpp
+++ b/src/mir/from_hir_match.cpp
@@ -300,7 +300,7 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod
// NOTE: Terminating the scope slightly early is safe, because the resulting boolean temp isn't invalidated.
builder.terminate_scope( arm.m_code->span(), mv$(tmp_scope) );
ac.cond_end = builder.pause_cur_block();
-
+
// NOTE: Paused so that later code (which knows what the false branch will be) can end it correctly
// TODO: What to do with contidionals in the fast model?
@@ -314,12 +314,12 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod
// Code
DEBUG("-- Body Code");
-
+
ac.code = builder.new_bb_unlinked();
auto tmp_scope = builder.new_scope_temp(arm.m_code->span());
builder.set_cur_block( ac.code );
conv.visit_node_ptr( arm.m_code );
-
+
if( !builder.block_active() && !builder.has_result() ) {
DEBUG("Arm diverged");
// Nothing need be done, as the block diverged.
@@ -382,7 +382,7 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod
{
DEBUG("> (" << arm_rule.arm_idx << ", " << arm_rule.pat_idx << ") - " << arm_rule.m_rules);
}
-
+
// TODO: Don't generate inner code until decisions are generated (keeps MIR flow nice)
// TODO: Detect if a rule is ordering-dependent. In this case we currently have to fall back on the simple match code
diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp
index 92c21286..9af721a2 100644
--- a/src/mir/mir_builder.cpp
+++ b/src/mir/mir_builder.cpp
@@ -413,7 +413,7 @@ void MirBuilder::raise_variables(const Span& sp, const ::MIR::LValue& val, const
break ;
}
)
-
+
// If the temporary was defined above the desired scope (i.e. this didn't find it), return
if( *scope_it == scope.idx )
return ;