Skip to content

Commit 6d6c620

Browse files
committed
Report grammatic and type-based unreachable code errors in the same way
1 parent def5e37 commit 6d6c620

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

src/compiler/binder.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,9 @@ namespace ts {
672672
bindJSDoc(node);
673673
return;
674674
}
675+
if (node.kind >= SyntaxKind.FirstStatement && node.kind <= SyntaxKind.LastStatement) {
676+
node.flowNode = currentFlow;
677+
}
675678
switch (node.kind) {
676679
case SyntaxKind.WhileStatement:
677680
bindWhileStatement(<WhileStatement>node);

src/compiler/checker.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17057,11 +17057,7 @@ namespace ts {
1705717057
// on empty arrays are possible without implicit any errors and new element types can be inferred without
1705817058
// type mismatch errors.
1705917059
const resultType = getObjectFlags(evolvedType) & ObjectFlags.EvolvingArray && isEvolvingArrayOperationTarget(reference) ? autoArrayType : finalizeEvolvingArrayType(evolvedType);
17060-
if (resultType === unreachableNeverType) {
17061-
error(reference, Diagnostics.Unreachable_code_detected);
17062-
return declaredType;
17063-
}
17064-
if (reference.parent && reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(resultType, TypeFacts.NEUndefinedOrNull).flags & TypeFlags.Never) {
17060+
if (resultType === unreachableNeverType|| reference.parent && reference.parent.kind === SyntaxKind.NonNullExpression && getTypeWithFacts(resultType, TypeFacts.NEUndefinedOrNull).flags & TypeFlags.Never) {
1706517061
return declaredType;
1706617062
}
1706717063
return resultType;
@@ -30533,6 +30529,10 @@ namespace ts {
3053330529
cancellationToken.throwIfCancellationRequested();
3053430530
}
3053530531
}
30532+
if (kind >= SyntaxKind.FirstStatement && kind <= SyntaxKind.LastStatement &&
30533+
!compilerOptions.allowUnreachableCode && node.flowNode && !isReachableFlowNode(node.flowNode)) {
30534+
errorOrSuggestion(compilerOptions.allowUnreachableCode === false, node, Diagnostics.Unreachable_code_detected);
30535+
}
3053630536

3053730537
switch (kind) {
3053830538
case SyntaxKind.TypeParameter:

src/compiler/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ namespace ts {
363363
SemicolonClassElement,
364364
// Element
365365
Block,
366-
VariableStatement,
367366
EmptyStatement,
367+
VariableStatement,
368368
ExpressionStatement,
369369
IfStatement,
370370
DoStatement,
@@ -514,6 +514,8 @@ namespace ts {
514514
LastTemplateToken = TemplateTail,
515515
FirstBinaryOperator = LessThanToken,
516516
LastBinaryOperator = CaretEqualsToken,
517+
FirstStatement = VariableStatement,
518+
LastStatement = DebuggerStatement,
517519
FirstNode = QualifiedName,
518520
FirstJSDocNode = JSDocTypeExpression,
519521
LastJSDocNode = JSDocPropertyTag,

0 commit comments

Comments
 (0)