summaryrefslogtreecommitdiff
path: root/src/mir/from_hir.cpp
diff options
context:
space:
mode:
authorJohn Hodge (bugs) <tpg@mutabah.net>2017-06-04 21:23:24 +0800
committerJohn Hodge (bugs) <tpg@mutabah.net>2017-06-04 21:23:24 +0800
commit83dbb728f62306d2e43b2688dd0f2d320fd5b038 (patch)
treea064267bdf8d0455ed725140abfcbed3e04b2d4a /src/mir/from_hir.cpp
parent0b9fd0014c8f32ecf299dae2ad1811dfb484af46 (diff)
parentf19c75571c48588fb3816e8eb5b96f03474fbdf5 (diff)
downloadmrust-83dbb728f62306d2e43b2688dd0f2d320fd5b038.tar.gz
Merge branch 'master' of https://github.com/thepowersgang/mrustc
Diffstat (limited to 'src/mir/from_hir.cpp')
-rw-r--r--src/mir/from_hir.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index ceda0a87..d9796aed 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -1723,6 +1723,16 @@ namespace {
}));
}
+ // rustc has drop_in_place as a lang item, mrustc uses an intrinsic
+ if( gpath.m_path == m_builder.crate().get_lang_item_path_opt("drop_in_place") )
+ {
+ m_builder.end_block(::MIR::Terminator::make_Call({
+ next_block, panic_block,
+ res.clone(), ::MIR::CallTarget::make_Intrinsic({ "drop_in_place", gpath.m_params.clone() }),
+ mv$(values)
+ }));
+ }
+
if( fcn.m_return.m_data.is_Diverge() )
{
unconditional_diverge = true;
@@ -1814,19 +1824,22 @@ namespace {
::std::stringstream(node.m_field) >> idx;
m_builder.set_result( node.span(), ::MIR::LValue::make_Field({ box$(val), idx }) );
}
- else if( val_ty.m_data.as_Path().binding.is_Struct() ) {
- const auto& str = *node.m_value->m_res_type.m_data.as_Path().binding.as_Struct();
+ else if( const auto* bep = val_ty.m_data.as_Path().binding.opt_Struct() ) {
+ const auto& str = **bep;
const auto& fields = str.m_data.as_Named();
idx = ::std::find_if( fields.begin(), fields.end(), [&](const auto& x){ return x.first == node.m_field; } ) - fields.begin();
m_builder.set_result( node.span(), ::MIR::LValue::make_Field({ box$(val), idx }) );
}
- else {
- const auto& unm = *node.m_value->m_res_type.m_data.as_Path().binding.as_Union();
+ else if( const auto* bep = val_ty.m_data.as_Path().binding.opt_Union() ) {
+ const auto& unm = **bep;
const auto& fields = unm.m_variants;
idx = ::std::find_if( fields.begin(), fields.end(), [&](const auto& x){ return x.first == node.m_field; } ) - fields.begin();
m_builder.set_result( node.span(), ::MIR::LValue::make_Downcast({ box$(val), idx }) );
}
+ else {
+ BUG(node.span(), "Field access on non-union/struct - " << val_ty);
+ }
}
void visit(::HIR::ExprNode_Literal& node) override
{
@@ -2075,6 +2088,14 @@ namespace {
BUG(node.span(), "_StructLiteral Union");
),
(Struct,
+ if(e->m_data.is_Unit()) {
+ m_builder.set_result( node.span(), ::MIR::RValue::make_Struct({
+ node.m_path.clone(),
+ variant_index,
+ {}
+ }) );
+ return ;
+ }
fields_ptr = &e->m_data.as_Named();
)
)