diff --git a/spec.html b/spec.html
index 50a32f527e..100e090abd 100644
--- a/spec.html
+++ b/spec.html
@@ -25365,7 +25365,7 @@
-
+
Static Semantics: HasCallInTailPosition (
_call_: a |CallExpression| Parse Node, a |MemberExpression| Parse Node, or an |OptionalChain| Parse Node,
@@ -25376,333 +25376,327 @@
_call_ is a Parse Node that represents a specific range of source text. When the following algorithms compare _call_ to another Parse Node, it is a test of whether they represent the same source text.
+
+ A potential tail position call that is immediately followed by return GetValue of the call result is also a possible tail position call. A function call cannot return a Reference Record, so such a GetValue operation will always return the same value as the actual function call result.
+
-
- Statement Rules
- StatementList : StatementList StatementListItem
-
- 1. Let _has_ be HasCallInTailPosition of |StatementList| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. Return HasCallInTailPosition of |StatementListItem| with argument _call_.
-
-
- FunctionStatementList :
- [empty]
+ StatementList : StatementList StatementListItem
+
+ 1. Let _has_ be HasCallInTailPosition of |StatementList| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. Return HasCallInTailPosition of |StatementListItem| with argument _call_.
+
+
+ FunctionStatementList :
+ [empty]
- StatementListItem :
- Declaration
+ StatementListItem :
+ Declaration
- Statement :
- VariableStatement
- EmptyStatement
- ExpressionStatement
- ContinueStatement
- BreakStatement
- ThrowStatement
- DebuggerStatement
+ Statement :
+ VariableStatement
+ EmptyStatement
+ ExpressionStatement
+ ContinueStatement
+ BreakStatement
+ ThrowStatement
+ DebuggerStatement
- Block :
- `{` `}`
+ Block :
+ `{` `}`
- ReturnStatement :
- `return` `;`
+ ReturnStatement :
+ `return` `;`
- LabelledItem :
- FunctionDeclaration
+ LabelledItem :
+ FunctionDeclaration
- ForInOfStatement :
- `for` `(` LeftHandSideExpression `of` AssignmentExpression `)` Statement
- `for` `(` `var` ForBinding `of` AssignmentExpression `)` Statement
- `for` `(` ForDeclaration `of` AssignmentExpression `)` Statement
+ ForInOfStatement :
+ `for` `(` LeftHandSideExpression `of` AssignmentExpression `)` Statement
+ `for` `(` `var` ForBinding `of` AssignmentExpression `)` Statement
+ `for` `(` ForDeclaration `of` AssignmentExpression `)` Statement
- CaseBlock :
- `{` `}`
-
-
- 1. Return *false*.
-
- IfStatement : `if` `(` Expression `)` Statement `else` Statement
-
- 1. Let _has_ be HasCallInTailPosition of the first |Statement| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. Return HasCallInTailPosition of the second |Statement| with argument _call_.
-
-
- IfStatement :
- `if` `(` Expression `)` Statement
+ CaseBlock :
+ `{` `}`
+
+
+ 1. Return *false*.
+
+ IfStatement : `if` `(` Expression `)` Statement `else` Statement
+
+ 1. Let _has_ be HasCallInTailPosition of the first |Statement| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. Return HasCallInTailPosition of the second |Statement| with argument _call_.
+
+
+ IfStatement :
+ `if` `(` Expression `)` Statement
- DoWhileStatement :
- `do` Statement `while` `(` Expression `)` `;`
+ DoWhileStatement :
+ `do` Statement `while` `(` Expression `)` `;`
- WhileStatement :
- `while` `(` Expression `)` Statement
+ WhileStatement :
+ `while` `(` Expression `)` Statement
- ForStatement :
- `for` `(` Expression? `;` Expression? `;` Expression? `)` Statement
- `for` `(` `var` VariableDeclarationList `;` Expression? `;` Expression? `)` Statement
- `for` `(` LexicalDeclaration Expression? `;` Expression? `)` Statement
+ ForStatement :
+ `for` `(` Expression? `;` Expression? `;` Expression? `)` Statement
+ `for` `(` `var` VariableDeclarationList `;` Expression? `;` Expression? `)` Statement
+ `for` `(` LexicalDeclaration Expression? `;` Expression? `)` Statement
- ForInOfStatement :
- `for` `(` LeftHandSideExpression `in` Expression `)` Statement
- `for` `(` `var` ForBinding `in` Expression `)` Statement
- `for` `(` ForDeclaration `in` Expression `)` Statement
+ ForInOfStatement :
+ `for` `(` LeftHandSideExpression `in` Expression `)` Statement
+ `for` `(` `var` ForBinding `in` Expression `)` Statement
+ `for` `(` ForDeclaration `in` Expression `)` Statement
- WithStatement :
- `with` `(` Expression `)` Statement
-
-
- 1. Return HasCallInTailPosition of |Statement| with argument _call_.
-
-
- LabelledStatement :
- LabelIdentifier `:` LabelledItem
-
-
- 1. Return HasCallInTailPosition of |LabelledItem| with argument _call_.
-
- ReturnStatement : `return` Expression `;`
-
- 1. Return HasCallInTailPosition of |Expression| with argument _call_.
-
- SwitchStatement : `switch` `(` Expression `)` CaseBlock
-
- 1. Return HasCallInTailPosition of |CaseBlock| with argument _call_.
-
- CaseBlock : `{` CaseClauses? DefaultClause CaseClauses? `}`
-
- 1. Let _has_ be *false*.
- 1. If the first |CaseClauses| is present, let _has_ be HasCallInTailPosition of the first |CaseClauses| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. Let _has_ be HasCallInTailPosition of |DefaultClause| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. If the second |CaseClauses| is present, let _has_ be HasCallInTailPosition of the second |CaseClauses| with argument _call_.
- 1. Return _has_.
-
- CaseClauses : CaseClauses CaseClause
-
- 1. Let _has_ be HasCallInTailPosition of |CaseClauses| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. Return HasCallInTailPosition of |CaseClause| with argument _call_.
-
-
- CaseClause : `case` Expression `:` StatementList?
+ WithStatement :
+ `with` `(` Expression `)` Statement
+
+
+ 1. Return HasCallInTailPosition of |Statement| with argument _call_.
+
+
+ LabelledStatement :
+ LabelIdentifier `:` LabelledItem
+
+
+ 1. Return HasCallInTailPosition of |LabelledItem| with argument _call_.
+
+ ReturnStatement : `return` Expression `;`
+
+ 1. Return HasCallInTailPosition of |Expression| with argument _call_.
+
+ SwitchStatement : `switch` `(` Expression `)` CaseBlock
+
+ 1. Return HasCallInTailPosition of |CaseBlock| with argument _call_.
+
+ CaseBlock : `{` CaseClauses? DefaultClause CaseClauses? `}`
+
+ 1. Let _has_ be *false*.
+ 1. If the first |CaseClauses| is present, let _has_ be HasCallInTailPosition of the first |CaseClauses| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. Let _has_ be HasCallInTailPosition of |DefaultClause| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. If the second |CaseClauses| is present, let _has_ be HasCallInTailPosition of the second |CaseClauses| with argument _call_.
+ 1. Return _has_.
+
+ CaseClauses : CaseClauses CaseClause
+
+ 1. Let _has_ be HasCallInTailPosition of |CaseClauses| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. Return HasCallInTailPosition of |CaseClause| with argument _call_.
+
+
+ CaseClause : `case` Expression `:` StatementList?
- DefaultClause : `default` `:` StatementList?
-
-
- 1. If |StatementList| is present, return HasCallInTailPosition of |StatementList| with argument _call_.
- 1. Return *false*.
-
- TryStatement : `try` Block Catch
-
- 1. Return HasCallInTailPosition of |Catch| with argument _call_.
-
-
- TryStatement :
- `try` Block Finally
- `try` Block Catch Finally
-
-
- 1. Return HasCallInTailPosition of |Finally| with argument _call_.
-
- Catch : `catch` `(` CatchParameter `)` Block
-
- 1. Return HasCallInTailPosition of |Block| with argument _call_.
-
-
+ DefaultClause : `default` `:` StatementList?
+
+
+ 1. If |StatementList| is present, return HasCallInTailPosition of |StatementList| with argument _call_.
+ 1. Return *false*.
+
+ TryStatement : `try` Block Catch
+
+ 1. Return HasCallInTailPosition of |Catch| with argument _call_.
+
+
+ TryStatement :
+ `try` Block Finally
+ `try` Block Catch Finally
+
+
+ 1. Return HasCallInTailPosition of |Finally| with argument _call_.
+
+ Catch : `catch` `(` CatchParameter `)` Block
+
+ 1. Return HasCallInTailPosition of |Block| with argument _call_.
+
-
- Expression Rules
-
- A potential tail position call that is immediately followed by return GetValue of the call result is also a possible tail position call. A function call cannot return a Reference Record, so such a GetValue operation will always return the same value as the actual function call result.
-
-
- AssignmentExpression :
- YieldExpression
- ArrowFunction
- AsyncArrowFunction
- LeftHandSideExpression `=` AssignmentExpression
- LeftHandSideExpression AssignmentOperator AssignmentExpression
- LeftHandSideExpression `&&=` AssignmentExpression
- LeftHandSideExpression `||=` AssignmentExpression
- LeftHandSideExpression `??=` AssignmentExpression
-
- BitwiseANDExpression :
- BitwiseANDExpression `&` EqualityExpression
-
- BitwiseXORExpression :
- BitwiseXORExpression `^` BitwiseANDExpression
-
- BitwiseORExpression :
- BitwiseORExpression `|` BitwiseXORExpression
-
- EqualityExpression :
- EqualityExpression `==` RelationalExpression
- EqualityExpression `!=` RelationalExpression
- EqualityExpression `===` RelationalExpression
- EqualityExpression `!==` RelationalExpression
-
- RelationalExpression :
- RelationalExpression `<` ShiftExpression
- RelationalExpression `>` ShiftExpression
- RelationalExpression `<=` ShiftExpression
- RelationalExpression `>=` ShiftExpression
- RelationalExpression `instanceof` ShiftExpression
- RelationalExpression `in` ShiftExpression
- PrivateIdentifier `in` ShiftExpression
-
- ShiftExpression :
- ShiftExpression `<<` AdditiveExpression
- ShiftExpression `>>` AdditiveExpression
- ShiftExpression `>>>` AdditiveExpression
-
- AdditiveExpression :
- AdditiveExpression `+` MultiplicativeExpression
- AdditiveExpression `-` MultiplicativeExpression
-
- MultiplicativeExpression :
- MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
-
- ExponentiationExpression :
- UpdateExpression `**` ExponentiationExpression
-
- UpdateExpression :
- LeftHandSideExpression `++`
- LeftHandSideExpression `--`
- `++` UnaryExpression
- `--` UnaryExpression
-
- UnaryExpression :
- `delete` UnaryExpression
- `void` UnaryExpression
- `typeof` UnaryExpression
- `+` UnaryExpression
- `-` UnaryExpression
- `~` UnaryExpression
- `!` UnaryExpression
- AwaitExpression
-
- CallExpression :
- SuperCall
- CallExpression `[` Expression `]`
- CallExpression `.` IdentifierName
- CallExpression `.` PrivateIdentifier
+
+ AssignmentExpression :
+ YieldExpression
+ ArrowFunction
+ AsyncArrowFunction
+ LeftHandSideExpression `=` AssignmentExpression
+ LeftHandSideExpression AssignmentOperator AssignmentExpression
+ LeftHandSideExpression `&&=` AssignmentExpression
+ LeftHandSideExpression `||=` AssignmentExpression
+ LeftHandSideExpression `??=` AssignmentExpression
- NewExpression :
- `new` NewExpression
+ BitwiseANDExpression :
+ BitwiseANDExpression `&` EqualityExpression
- MemberExpression :
- MemberExpression `[` Expression `]`
- MemberExpression `.` IdentifierName
- SuperProperty
- MetaProperty
- `new` MemberExpression Arguments
- MemberExpression `.` PrivateIdentifier
+ BitwiseXORExpression :
+ BitwiseXORExpression `^` BitwiseANDExpression
- PrimaryExpression :
- `this`
- IdentifierReference
- Literal
- ArrayLiteral
- ObjectLiteral
- FunctionExpression
- ClassExpression
- GeneratorExpression
- AsyncFunctionExpression
- AsyncGeneratorExpression
- RegularExpressionLiteral
- TemplateLiteral
-
-
- 1. Return *false*.
-
-
- Expression :
- AssignmentExpression
- Expression `,` AssignmentExpression
-
-
- 1. Return HasCallInTailPosition of |AssignmentExpression| with argument _call_.
-
- ConditionalExpression : ShortCircuitExpression `?` AssignmentExpression `:` AssignmentExpression
-
- 1. Let _has_ be HasCallInTailPosition of the first |AssignmentExpression| with argument _call_.
- 1. If _has_ is *true*, return *true*.
- 1. Return HasCallInTailPosition of the second |AssignmentExpression| with argument _call_.
-
- LogicalANDExpression : LogicalANDExpression `&&` BitwiseORExpression
-
- 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_.
-
- LogicalORExpression : LogicalORExpression `||` LogicalANDExpression
-
- 1. Return HasCallInTailPosition of |LogicalANDExpression| with argument _call_.
-
- CoalesceExpression : CoalesceExpressionHead `??` BitwiseORExpression
-
- 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_.
-
-
- CallExpression :
- CoverCallExpressionAndAsyncArrowHead
- CallExpression Arguments
- CallExpression TemplateLiteral
-
-
- 1. If this |CallExpression| is _call_, return *true*.
- 1. Return *false*.
-
-
- OptionalExpression :
- MemberExpression OptionalChain
- CallExpression OptionalChain
- OptionalExpression OptionalChain
-
-
- 1. Return HasCallInTailPosition of |OptionalChain| with argument _call_.
-
-
- OptionalChain :
- `?.` `[` Expression `]`
- `?.` IdentifierName
- `?.` PrivateIdentifier
- OptionalChain `[` Expression `]`
- OptionalChain `.` IdentifierName
- OptionalChain `.` PrivateIdentifier
-
-
- 1. Return *false*.
-
-
- OptionalChain :
- `?.` Arguments
- OptionalChain Arguments
-
-
- 1. If this |OptionalChain| is _call_, return *true*.
- 1. Return *false*.
-
-
- MemberExpression :
- MemberExpression TemplateLiteral
-
-
- 1. If this |MemberExpression| is _call_, return *true*.
- 1. Return *false*.
-
- PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
-
- 1. Let _expr_ be the |ParenthesizedExpression| that is covered by |CoverParenthesizedExpressionAndArrowParameterList|.
- 1. Return HasCallInTailPosition of _expr_ with argument _call_.
-
-
- ParenthesizedExpression :
- `(` Expression `)`
-
-
- 1. Return HasCallInTailPosition of |Expression| with argument _call_.
-
-
+ BitwiseORExpression :
+ BitwiseORExpression `|` BitwiseXORExpression
+
+ EqualityExpression :
+ EqualityExpression `==` RelationalExpression
+ EqualityExpression `!=` RelationalExpression
+ EqualityExpression `===` RelationalExpression
+ EqualityExpression `!==` RelationalExpression
+
+ RelationalExpression :
+ RelationalExpression `<` ShiftExpression
+ RelationalExpression `>` ShiftExpression
+ RelationalExpression `<=` ShiftExpression
+ RelationalExpression `>=` ShiftExpression
+ RelationalExpression `instanceof` ShiftExpression
+ RelationalExpression `in` ShiftExpression
+ PrivateIdentifier `in` ShiftExpression
+
+ ShiftExpression :
+ ShiftExpression `<<` AdditiveExpression
+ ShiftExpression `>>` AdditiveExpression
+ ShiftExpression `>>>` AdditiveExpression
+
+ AdditiveExpression :
+ AdditiveExpression `+` MultiplicativeExpression
+ AdditiveExpression `-` MultiplicativeExpression
+
+ MultiplicativeExpression :
+ MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
+
+ ExponentiationExpression :
+ UpdateExpression `**` ExponentiationExpression
+
+ UpdateExpression :
+ LeftHandSideExpression `++`
+ LeftHandSideExpression `--`
+ `++` UnaryExpression
+ `--` UnaryExpression
+
+ UnaryExpression :
+ `delete` UnaryExpression
+ `void` UnaryExpression
+ `typeof` UnaryExpression
+ `+` UnaryExpression
+ `-` UnaryExpression
+ `~` UnaryExpression
+ `!` UnaryExpression
+ AwaitExpression
+
+ CallExpression :
+ SuperCall
+ CallExpression `[` Expression `]`
+ CallExpression `.` IdentifierName
+ CallExpression `.` PrivateIdentifier
+
+ NewExpression :
+ `new` NewExpression
+
+ MemberExpression :
+ MemberExpression `[` Expression `]`
+ MemberExpression `.` IdentifierName
+ SuperProperty
+ MetaProperty
+ `new` MemberExpression Arguments
+ MemberExpression `.` PrivateIdentifier
+
+ PrimaryExpression :
+ `this`
+ IdentifierReference
+ Literal
+ ArrayLiteral
+ ObjectLiteral
+ FunctionExpression
+ ClassExpression
+ GeneratorExpression
+ AsyncFunctionExpression
+ AsyncGeneratorExpression
+ RegularExpressionLiteral
+ TemplateLiteral
+
+
+ 1. Return *false*.
+
+
+ Expression :
+ AssignmentExpression
+ Expression `,` AssignmentExpression
+
+
+ 1. Return HasCallInTailPosition of |AssignmentExpression| with argument _call_.
+
+ ConditionalExpression : ShortCircuitExpression `?` AssignmentExpression `:` AssignmentExpression
+
+ 1. Let _has_ be HasCallInTailPosition of the first |AssignmentExpression| with argument _call_.
+ 1. If _has_ is *true*, return *true*.
+ 1. Return HasCallInTailPosition of the second |AssignmentExpression| with argument _call_.
+
+ LogicalANDExpression : LogicalANDExpression `&&` BitwiseORExpression
+
+ 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_.
+
+ LogicalORExpression : LogicalORExpression `||` LogicalANDExpression
+
+ 1. Return HasCallInTailPosition of |LogicalANDExpression| with argument _call_.
+
+ CoalesceExpression : CoalesceExpressionHead `??` BitwiseORExpression
+
+ 1. Return HasCallInTailPosition of |BitwiseORExpression| with argument _call_.
+
+
+ CallExpression :
+ CoverCallExpressionAndAsyncArrowHead
+ CallExpression Arguments
+ CallExpression TemplateLiteral
+
+
+ 1. If this |CallExpression| is _call_, return *true*.
+ 1. Return *false*.
+
+
+ OptionalExpression :
+ MemberExpression OptionalChain
+ CallExpression OptionalChain
+ OptionalExpression OptionalChain
+
+
+ 1. Return HasCallInTailPosition of |OptionalChain| with argument _call_.
+
+
+ OptionalChain :
+ `?.` `[` Expression `]`
+ `?.` IdentifierName
+ `?.` PrivateIdentifier
+ OptionalChain `[` Expression `]`
+ OptionalChain `.` IdentifierName
+ OptionalChain `.` PrivateIdentifier
+
+
+ 1. Return *false*.
+
+
+ OptionalChain :
+ `?.` Arguments
+ OptionalChain Arguments
+
+
+ 1. If this |OptionalChain| is _call_, return *true*.
+ 1. Return *false*.
+
+
+ MemberExpression :
+ MemberExpression TemplateLiteral
+
+
+ 1. If this |MemberExpression| is _call_, return *true*.
+ 1. Return *false*.
+
+ PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
+
+ 1. Let _expr_ be the |ParenthesizedExpression| that is covered by |CoverParenthesizedExpressionAndArrowParameterList|.
+ 1. Return HasCallInTailPosition of _expr_ with argument _call_.
+
+
+ ParenthesizedExpression :
+ `(` Expression `)`
+
+
+ 1. Return HasCallInTailPosition of |Expression| with argument _call_.
+