summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-09-04 15:54:15 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-09-04 15:54:15 +0800
commit96dddd40e187d8c9ecd4997ca3bec839f645db0a (patch)
tree1d4a283a3ac12e726ed16a7f8b407f6928e50af0 /src
parent097f036747d0b99c6d9d2744190c614c02bbb388 (diff)
downloadmrust-96dddd40e187d8c9ecd4997ca3bec839f645db0a.tar.gz
Parse - Change handling of trailing expressions
Diffstat (limited to 'src')
-rw-r--r--src/parse/expr.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index b5263bec..7d9da66c 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -53,15 +53,16 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe/*=false*/)
TRACE_FUNCTION;
Token tok;
- bool yields_final_value = true;
::std::vector<ExprNodeP> nodes;
::std::shared_ptr<AST::Module> local_mod;
GET_CHECK_TOK(tok, lex, TOK_BRACE_OPEN);
+ bool last_value_yielded = false;
while( LOOK_AHEAD(lex) != TOK_BRACE_CLOSE )
{
+ last_value_yielded = false;
DEBUG("tok = " << tok);
// NOTE: Doc comments can appear within a function and apply to the function
@@ -76,25 +77,22 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe/*=false*/)
break;
bool add_silence_if_end = false;
+ // `add_silence_if_end` indicates that the statement had a semicolon.
auto rv = Parse_ExprBlockLine_WithItems(lex, local_mod, add_silence_if_end);
if( rv )
{
// Set to TRUE if there was no semicolon after a statement
- if( LOOK_AHEAD(lex) == TOK_BRACE_CLOSE && add_silence_if_end )
- {
- DEBUG("End of block, and add_silence_if_end == true - doesn't yeild");
- yields_final_value = false;
- // Since the next token is TOK_BRACE_CLOSE, the loop will terminate
- }
+ last_value_yielded = !add_silence_if_end;
nodes.push_back( mv$(rv) );
}
else {
assert( !add_silence_if_end );
+ last_value_yielded = false;
}
}
GET_CHECK_TOK(tok, lex, TOK_BRACE_CLOSE);
- return NEWNODE( AST::ExprNode_Block, is_unsafe, yields_final_value, mv$(nodes), mv$(local_mod) );
+ return NEWNODE( AST::ExprNode_Block, is_unsafe, last_value_yielded, mv$(nodes), mv$(local_mod) );
}
/// Parse a single line in a block, handling items added to the local module