diff options
author | John Hodge <tpg@mutabah.net> | 2017-01-07 09:58:05 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-01-07 09:58:05 +0800 |
commit | 215f9d27213265457fe56a3949e85daa5393c513 (patch) | |
tree | 53dbf5621edd0cb71fb1cb69fee73c2c8c776d68 /src | |
parent | d036d2521f829df23b70e223965b238205ef2aff (diff) | |
download | mrust-215f9d27213265457fe56a3949e85daa5393c513.tar.gz |
Codegen C - Pointer comparisons
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/codegen_c.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index cf5874c8..6250d147 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -1303,6 +1303,43 @@ namespace { m_of << ")"; break; } + else if( const auto* te = ty.m_data.opt_Pointer() ) { + if( metadata_type(*te->inner) != MetadataType::None ) + { + switch(ve.op) + { + case ::MIR::eBinOp::EQ: + emit_lvalue(ve.val_l); m_of << ".PTR == "; emit_lvalue(ve.val_r); m_of << ".PTR && "; + emit_lvalue(ve.val_l); m_of << ".META == "; emit_lvalue(ve.val_r); m_of << ".META"; + break; + case ::MIR::eBinOp::NE: + emit_lvalue(ve.val_l); m_of << ".PTR != "; emit_lvalue(ve.val_r); m_of << ".PTR || "; + emit_lvalue(ve.val_l); m_of << ".META != "; emit_lvalue(ve.val_r); m_of << ".META"; + break; + default: + MIR_BUG(mir_res, "Unknown comparison of a *-ptr - " << e.src << " with " << ty); + } + } + else + { + emit_lvalue(ve.val_l); + switch(ve.op) + { + case ::MIR::eBinOp::EQ: m_of << " == "; break; + case ::MIR::eBinOp::NE: m_of << " != "; break; + case ::MIR::eBinOp::GT: m_of << " > " ; break; + case ::MIR::eBinOp::GE: m_of << " >= "; break; + case ::MIR::eBinOp::LT: m_of << " < " ; break; + case ::MIR::eBinOp::LE: m_of << " <= "; break; + default: + MIR_BUG(mir_res, "Unknown comparison of a *-ptr - " << e.src << " with " << ty); + } + emit_lvalue(ve.val_r); + } + break; + } + else { + } emit_lvalue(ve.val_l); switch(ve.op) |