summaryrefslogtreecommitdiff
path: root/src/mir/from_hir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/from_hir.cpp')
-rw-r--r--src/mir/from_hir.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 722e3aa1..4b9b6f5e 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -1524,20 +1524,29 @@ namespace {
for(auto& arg : args)
{
this->visit_node_ptr(arg);
-
- if( args.size() == 1 )
+ if( !m_builder.block_active() )
+ {
+ auto tmp = m_builder.new_temporary(arg->m_res_type);
+ values.push_back( mv$(tmp) );
+ }
+ else if( args.size() == 1 )
{
values.push_back( m_builder.get_result_in_param(arg->span(), arg->m_res_type, /*allow_missing_value=*/true) );
}
else
{
- // NOTE: Have to allocate a new temporary because ordering matters
- auto tmp = m_builder.new_temporary(arg->m_res_type);
- if( m_builder.block_active() )
+ auto res = m_builder.get_result(arg->span());
+ if( auto* e = res.opt_Constant() )
{
- m_builder.push_stmt_assign( arg->span(), tmp.clone(), m_builder.get_result(arg->span()) );
+ values.push_back( mv$(*e) );
+ }
+ else
+ {
+ // NOTE: Have to allocate a new temporary because ordering matters
+ auto tmp = m_builder.new_temporary(arg->m_res_type);
+ m_builder.push_stmt_assign( arg->span(), tmp.clone(), mv$(res) );
+ values.push_back( mv$(tmp) );
}
- values.push_back( mv$(tmp) );
}
if(const auto* e = values.back().opt_LValue() )