summaryrefslogtreecommitdiff
path: root/src/mir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-05-15 16:20:13 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-05-15 16:20:13 +0800
commit0355ff324f85f3f312c1d0204f6a95164541bbc4 (patch)
treee40295889220713ef7bcc852b06a3cfae06303cf /src/mir
parent08c7a7e2cb1b8b137a252edf0c615cd81477adf8 (diff)
downloadmrust-0355ff324f85f3f312c1d0204f6a95164541bbc4.tar.gz
MIR Gen - Don't emit drop for union values
Diffstat (limited to 'src/mir')
-rw-r--r--src/mir/mir_builder.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp
index 89039dd5..625731cc 100644
--- a/src/mir/mir_builder.cpp
+++ b/src/mir/mir_builder.cpp
@@ -1672,6 +1672,7 @@ void MirBuilder::with_val_type(const Span& sp, const ::MIR::LValue& val, ::std::
}
else if( const auto* tep = te.binding.opt_Union() )
{
+ BUG(sp, "Field access on a union isn't valid, use Downcast instead - " << ty);
const auto& unm = **tep;
auto maybe_monomorph = [&](const ::HIR::TypeRef& t)->const ::HIR::TypeRef& {
if( monomorphise_type_needed(t) ) {
@@ -2215,8 +2216,10 @@ void MirBuilder::drop_value_from_state(const Span& sp, const VarState& vs, ::MIR
),
(Partial,
bool is_enum = false;
+ bool is_union = false;
with_val_type(sp, lv, [&](const auto& ty){
is_enum = ty.m_data.is_Path() && ty.m_data.as_Path().binding.is_Enum();
+ is_union = ty.m_data.is_Path() && ty.m_data.as_Path().binding.is_Union();
});
if(is_enum)
{
@@ -2226,6 +2229,10 @@ void MirBuilder::drop_value_from_state(const Span& sp, const VarState& vs, ::MIR
// drop_value_from_state(sp, vse.inner_states[i], ::MIR::LValue::make_Downcast({ box$(lv.clone()), static_cast<unsigned int>(i) }));
//}
}
+ else if( is_union )
+ {
+ // NOTE: Unions don't drop inner items.
+ }
else
{
for(size_t i = 0; i < vse.inner_states.size(); i ++)