summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-09-01 11:33:44 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-09-01 11:33:44 +0800
commitce87b125f3e5bd95d046e6ceae2a93fa5d4d674a (patch)
tree7d0b595230b927356506355fc57a992428b41aaa
parent4261a96ad5abeb3af1385eed4abeafc6f4e9823f (diff)
downloadmrust-ce87b125f3e5bd95d046e6ceae2a93fa5d4d674a.tar.gz
HIR Typecheck - Break value
-rw-r--r--src/hir_typeck/expr_cs.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 48f5095b..918f3cd7 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -681,9 +681,6 @@ namespace {
ERROR(node.span(), E0000, "Break statement with no acive loop");
}
- // NOTE: There's an RFC proposal (that's on track to be accepted) that allows `break value;`
- auto break_type = ::HIR::TypeRef::new_unit();
-
::HIR::ExprNode_Loop* loop_node_ptr;
if( node.m_label != "" )
{
@@ -701,7 +698,15 @@ namespace {
DEBUG("Break out of loop " << loop_node_ptr);
auto& loop_node = *loop_node_ptr;
loop_node.m_diverges = false;
- this->context.equate_types(node.span(), loop_node.m_res_type, break_type);
+
+ if( node.m_value ) {
+ this->context.add_ivars(node.m_value->m_res_type);
+ node.m_value->visit(*this);
+ this->context.equate_types(node.span(), loop_node.m_res_type, node.m_value->m_res_type);
+ }
+ else {
+ this->context.equate_types(node.span(), loop_node.m_res_type, ::HIR::TypeRef::new_unit());
+ }
}
}