summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-17 09:28:14 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-17 09:28:14 +0800
commit8062b43a179b645df1fc11d8b1b1112baa43d964 (patch)
tree1fa1cb71d50e62b97bfba05ad8e75f851bcecfc1 /src
parent0f3b719e8c279d86361aa029b35eb959a7838433 (diff)
downloadmrust-8062b43a179b645df1fc11d8b1b1112baa43d964.tar.gz
Trans C - Handle bool inverting
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index ec85ec0f..2ae6b27a 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -425,6 +425,12 @@ namespace {
for(unsigned int i = 0; i < code->blocks.size(); i ++)
{
TRACE_FUNCTION_F(p << " bb" << i);
+
+ if( code->blocks[i].statements.size() == 0 && code->blocks[i].terminator.is_Diverge() ) {
+ DEBUG("- Diverge only, omitting");
+ m_of << "bb" << i << ": _Unwind_Resume(); // Diverge\n";
+ continue ;
+ }
m_of << "bb" << i << ":\n";
@@ -622,12 +628,18 @@ namespace {
emit_lvalue(ve.val_r);
),
(UniOp,
+ ::HIR::TypeRef tmp;
emit_lvalue(e.dst);
m_of << " = ";
switch(ve.op)
{
case ::MIR::eUniOp::NEG: m_of << "-"; break;
- case ::MIR::eUniOp::INV: m_of << "~"; break;
+ case ::MIR::eUniOp::INV:
+ if( mir_res.get_lvalue_type(tmp, e.dst) == ::HIR::CoreType::Bool )
+ m_of << "!";
+ else
+ m_of << "~";
+ break;
}
emit_lvalue(ve.val);
),
@@ -945,6 +957,7 @@ namespace {
m_of << "\tgoto bb" << e.ret_block << ";\n";
)
)
+ m_of << "\t// ^ " << code->blocks[i].terminator << "\n";
}
m_of << "}\n";
m_of.flush();