diff options
author | John Hodge <tpg@mutabah.net> | 2017-01-21 18:07:25 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-01-21 18:07:25 +0800 |
commit | a3d4dd65e0029f42c8cbc1869bb4d4357852cd81 (patch) | |
tree | b3a2c6d23f20f9ec97da94fc2494b693e10f06d7 /src/mir/from_hir.hpp | |
parent | 41c852259d814cccb9d172d365c9cfddbc44bdfe (diff) | |
download | mrust-a3d4dd65e0029f42c8cbc1869bb4d4357852cd81.tar.gz |
MIR Gen - Fix drop generation
Diffstat (limited to 'src/mir/from_hir.hpp')
-rw-r--r-- | src/mir/from_hir.hpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/mir/from_hir.hpp b/src/mir/from_hir.hpp index c33ba274..0dfc9e50 100644 --- a/src/mir/from_hir.hpp +++ b/src/mir/from_hir.hpp @@ -91,9 +91,11 @@ TAGGED_UNION(ScopeType, Variables, ::std::vector<SplitArm> arms; }), (Loop, struct { - ::std::set<unsigned int> changed_vars; - ::std::set<unsigned int> changed_tmps; - ::std::vector<SplitArm> exit_states; + // NOTE: This contains the original state for variables changed after `exit_state_valid` is true + ::std::map<unsigned int,VarState> changed_vars; + ::std::map<unsigned int,VarState> changed_tmps; + bool exit_state_valid; + SplitEnd exit_state; }) ); @@ -225,6 +227,8 @@ private: const VarState& get_temp_state(const Span& sp, unsigned int idx, unsigned int skip_count=0) const; VarState& get_temp_state_mut(const Span& sp, unsigned int idx); + void terminate_loop_early(const Span& sp, ScopeType::Data_Loop& sd_loop); + void drop_value_from_state(const Span& sp, const VarState& vs, ::MIR::LValue lv); void drop_scope_values(const ScopeDef& sd); void complete_scope(ScopeDef& sd); |