Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 3549cca365e8f77393a38ca0c3aea39daed8e112..dfd599f014711f6947b9f716539aa39d2365fffc 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -2639,9 +2639,10 @@ Statement* Parser::ParseReturnStatement(bool* ok) { |
// TODO(ishell): update chapter number. |
// ES8 XX.YY.ZZ |
if (tail_call_position >= 0) { |
- if (!function_state_->collect_expressions_in_tail_position()) { |
- Scanner::Location loc(tail_call_position, tail_call_position + 1); |
- ReportMessageAt(loc, MessageTemplate::kTailCallInTryBlock); |
+ ReturnExprContext return_expr_context = |
+ function_state_->return_expr_context(); |
+ if (return_expr_context != ReturnExprContext::kNormal) { |
+ ReportIllegalTailCallAt(tail_call_position, return_expr_context); |
*ok = false; |
return NULL; |
} |
@@ -2848,7 +2849,8 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
Block* try_block; |
{ |
- DontCollectExpressionsInTailPositionScope no_tail_calls(function_state_); |
+ ReturnExprScope no_tail_calls(function_state_, |
+ ReturnExprContext::kInsideTryBlock); |
try_block = ParseBlock(NULL, CHECK_OK); |
} |
@@ -3555,8 +3557,8 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
factory()->NewBlock(NULL, 3, false, RelocInfo::kNoPosition); |
{ |
- DontCollectExpressionsInTailPositionScope no_tail_calls( |
- function_state_); |
+ ReturnExprScope no_tail_calls(function_state_, |
+ ReturnExprContext::kInsideForInOfBody); |
BlockState block_state(&scope_, body_scope); |
Statement* body = ParseScopedStatement(NULL, true, CHECK_OK); |