diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index b49e22e8192..cfeb76827bf 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -636,6 +636,9 @@ namespace ts { } function createFlowCondition(antecedent: FlowNode, expression: Expression, assumeTrue: boolean): FlowNode { + if (antecedent.kind === FlowKind.Unreachable) { + return antecedent; + } if (!expression) { return assumeTrue ? antecedent : unreachableFlow; } @@ -696,16 +699,19 @@ namespace ts { function bindDoStatement(node: DoStatement): void { const preDoLabel = createFlowLabel(); + const preConditionLabel = createFlowLabel(); const postDoLabel = createFlowLabel(); addAntecedent(preDoLabel, currentFlow); currentFlow = preDoLabel; const saveBreakTarget = breakTarget; const saveContinueTarget = continueTarget; breakTarget = postDoLabel; - continueTarget = preDoLabel; + continueTarget = preConditionLabel; bind(node.statement); breakTarget = saveBreakTarget; continueTarget = saveContinueTarget; + addAntecedent(preConditionLabel, currentFlow); + currentFlow = finishFlow(preConditionLabel); bind(node.expression); addAntecedent(preDoLabel, createFlowCondition(currentFlow, node.expression, /*assumeTrue*/ true)); addAntecedent(postDoLabel, createFlowCondition(currentFlow, node.expression, /*assumeTrue*/ false)); @@ -737,10 +743,10 @@ namespace ts { const preLoopLabel = createFlowLabel(); const postLoopLabel = createFlowLabel(); bind(node.initializer); - bind(node.expression); addAntecedent(preLoopLabel, currentFlow); - addAntecedent(postLoopLabel, currentFlow); currentFlow = preLoopLabel; + bind(node.expression); + addAntecedent(postLoopLabel, currentFlow); const saveBreakTarget = breakTarget; const saveContinueTarget = continueTarget; breakTarget = postLoopLabel; @@ -750,7 +756,6 @@ namespace ts { breakTarget = saveBreakTarget; continueTarget = saveContinueTarget; addAntecedent(preLoopLabel, currentFlow); - addAntecedent(postLoopLabel, currentFlow); currentFlow = finishFlow(postLoopLabel); } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9ae6faeff74..d8c62dd2da3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8674,7 +8674,9 @@ namespace ts { const parent = node.parent; return parent.kind === SyntaxKind.BinaryExpression && (parent).operatorToken.kind === SyntaxKind.EqualsToken && - (parent).left === node; + (parent).left === node || + (parent.kind === SyntaxKind.ForInStatement || parent.kind === SyntaxKind.ForOfStatement) && + (parent).initializer === node; } function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type {