summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-11 16:29:54 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-11 16:29:54 +0800
commit88cf7e2448a2916988fe2c909e1b4365cd17aed4 (patch)
tree051a74700bb050ae99b940fac6a380ca81bc56e6 /src
parent882fa1da5af17a277075064f1dcb7974b1d182ab (diff)
downloadmrust-88cf7e2448a2916988fe2c909e1b4365cd17aed4.tar.gz
MIR - Boolean operators (&& and ||) and char literals
Diffstat (limited to 'src')
-rw-r--r--src/mir/from_hir.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 47f4fae4..8749ba1c 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -1295,12 +1295,40 @@ namespace {
m_builder.push_stmt_assign(res.as_Temporary(), ::MIR::RValue::make_BinOp({ mv$(left), op, mv$(right) }));
break;
- case ::HIR::ExprNode_BinOp::Op::BoolAnd:
- TODO(node.span(), "BinOp &&");
- break;
- case ::HIR::ExprNode_BinOp::Op::BoolOr:
- TODO(node.span(), "BinOp ||");
- break;
+ case ::HIR::ExprNode_BinOp::Op::BoolAnd: {
+ auto bb_next = m_builder.new_bb_unlinked();
+ auto bb_true = m_builder.new_bb_unlinked();
+ auto bb_false = m_builder.new_bb_unlinked();
+ m_builder.end_block( ::MIR::Terminator::make_If({ mv$(left), bb_true, bb_false }) );
+ // If left is false, assign result false and return
+ m_builder.set_cur_block( bb_false );
+ m_builder.push_stmt_assign(res.clone(), ::MIR::RValue( ::MIR::Constant::make_Bool(false) ));
+ m_builder.end_block( ::MIR::Terminator::make_Goto(bb_next) );
+
+ // If left is true, assign result to right
+ m_builder.set_cur_block( bb_true );
+ m_builder.push_stmt_assign(res.clone(), mv$(right)); // TODO: Right doens't need to be an LValue here.
+ m_builder.end_block( ::MIR::Terminator::make_Goto(bb_next) );
+
+ m_builder.set_cur_block( bb_next );
+ } break;
+ case ::HIR::ExprNode_BinOp::Op::BoolOr: {
+ auto bb_next = m_builder.new_bb_unlinked();
+ auto bb_true = m_builder.new_bb_unlinked();
+ auto bb_false = m_builder.new_bb_unlinked();
+ m_builder.end_block( ::MIR::Terminator::make_If({ mv$(left), bb_true, bb_false }) );
+ // If left is true, assign result true and return
+ m_builder.set_cur_block( bb_true );
+ m_builder.push_stmt_assign(res.clone(), ::MIR::RValue( ::MIR::Constant::make_Bool(true) ));
+ m_builder.end_block( ::MIR::Terminator::make_Goto(bb_next) );
+
+ // If left is false, assign result to right
+ m_builder.set_cur_block( bb_false );
+ m_builder.push_stmt_assign(res.clone(), mv$(right)); // TODO: Right doens't need to be an LValue here.
+ m_builder.end_block( ::MIR::Terminator::make_Goto(bb_next) );
+
+ m_builder.set_cur_block( bb_next );
+ } break;
case ::HIR::ExprNode_BinOp::Op::Add: op = ::MIR::eBinOp::ADD; if(0)
case ::HIR::ExprNode_BinOp::Op::Sub: op = ::MIR::eBinOp::SUB; if(0)
@@ -1523,6 +1551,9 @@ namespace {
case ::HIR::CoreType::Isize:
m_builder.set_result(node.span(), ::MIR::RValue( ::MIR::Constant( static_cast<int64_t>(e.m_value) ) ));
break;
+ case ::HIR::CoreType::Char:
+ m_builder.set_result(node.span(), ::MIR::RValue( ::MIR::Constant( static_cast<uint64_t>(e.m_value) ) ));
+ break;
default:
BUG(node.span(), "Integer literal with unexpected type - " << node.m_res_type);
}