summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2017-01-07 09:58:05 +0800
committerJohn Hodge <tpg@mutabah.net>2017-01-07 09:58:05 +0800
commit215f9d27213265457fe56a3949e85daa5393c513 (patch)
tree53dbf5621edd0cb71fb1cb69fee73c2c8c776d68 /src
parentd036d2521f829df23b70e223965b238205ef2aff (diff)
downloadmrust-215f9d27213265457fe56a3949e85daa5393c513.tar.gz
Codegen C - Pointer comparisons
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp37
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)