diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-09-01 11:33:44 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-09-01 11:33:44 +0800 |
commit | ce87b125f3e5bd95d046e6ceae2a93fa5d4d674a (patch) | |
tree | 7d0b595230b927356506355fc57a992428b41aaa | |
parent | 4261a96ad5abeb3af1385eed4abeafc6f4e9823f (diff) | |
download | mrust-ce87b125f3e5bd95d046e6ceae2a93fa5d4d674a.tar.gz |
HIR Typecheck - Break value
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 13 |
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()); + } } } |