diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-17 09:28:14 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-17 09:28:14 +0800 |
commit | 8062b43a179b645df1fc11d8b1b1112baa43d964 (patch) | |
tree | 1fa1cb71d50e62b97bfba05ad8e75f851bcecfc1 | |
parent | 0f3b719e8c279d86361aa029b35eb959a7838433 (diff) | |
download | mrust-8062b43a179b645df1fc11d8b1b1112baa43d964.tar.gz |
Trans C - Handle bool inverting
-rw-r--r-- | src/trans/codegen_c.cpp | 15 |
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(); |