Skip to content

Commit 5132ea6

Browse files
committed
in noImplicitReturns mode, also disallow "return;"
In --noImplicitReturns mode, if a function specifies a return type, disallow empty "return;" statements. Fixes #5916.
1 parent 0f6dbd0 commit 5132ea6

File tree

4 files changed

+116
-5
lines changed

4 files changed

+116
-5
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13842,11 +13842,11 @@ namespace ts {
1384213842
}
1384313843
}
1384413844

13845-
if (node.expression) {
13846-
const func = getContainingFunction(node);
13847-
if (func) {
13848-
const signature = getSignatureFromDeclaration(func);
13849-
const returnType = getReturnTypeOfSignature(signature);
13845+
const func = getContainingFunction(node);
13846+
if (func) {
13847+
const signature = getSignatureFromDeclaration(func);
13848+
const returnType = getReturnTypeOfSignature(signature);
13849+
if (node.expression) {
1385013850
const exprType = checkExpressionCached(node.expression);
1385113851

1385213852
if (func.asteriskToken) {
@@ -13881,6 +13881,10 @@ namespace ts {
1388113881
}
1388213882
}
1388313883
}
13884+
else if (compilerOptions.noImplicitReturns && !maybeTypeOfKind(returnType, TypeFlags.Void | TypeFlags.Any)) {
13885+
// The function has a return type, but the return statement doesn't have an expression.
13886+
error(node, Diagnostics.Not_all_code_paths_return_a_value);
13887+
}
1388413888
}
1388513889
}
1388613890

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
tests/cases/compiler/noImplicitReturnsWithoutReturnExpression.ts(2,5): error TS7030: Not all code paths return a value.
2+
tests/cases/compiler/noImplicitReturnsWithoutReturnExpression.ts(22,9): error TS7030: Not all code paths return a value.
3+
4+
5+
==== tests/cases/compiler/noImplicitReturnsWithoutReturnExpression.ts (2 errors) ====
6+
function isMissingReturnExpression(): number {
7+
return;
8+
~~~~~~~
9+
!!! error TS7030: Not all code paths return a value.
10+
}
11+
12+
function isMissingReturnExpression2(): any {
13+
return;
14+
}
15+
16+
function isMissingReturnExpression3(): number|void {
17+
return;
18+
}
19+
20+
function isMissingReturnExpression4(): void {
21+
return;
22+
}
23+
24+
function isMissingReturnExpression5(x) {
25+
if (x) {
26+
return 0;
27+
}
28+
else {
29+
return;
30+
~~~~~~~
31+
!!! error TS7030: Not all code paths return a value.
32+
}
33+
}
34+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//// [noImplicitReturnsWithoutReturnExpression.ts]
2+
function isMissingReturnExpression(): number {
3+
return;
4+
}
5+
6+
function isMissingReturnExpression2(): any {
7+
return;
8+
}
9+
10+
function isMissingReturnExpression3(): number|void {
11+
return;
12+
}
13+
14+
function isMissingReturnExpression4(): void {
15+
return;
16+
}
17+
18+
function isMissingReturnExpression5(x) {
19+
if (x) {
20+
return 0;
21+
}
22+
else {
23+
return;
24+
}
25+
}
26+
27+
28+
//// [noImplicitReturnsWithoutReturnExpression.js]
29+
function isMissingReturnExpression() {
30+
return;
31+
}
32+
function isMissingReturnExpression2() {
33+
return;
34+
}
35+
function isMissingReturnExpression3() {
36+
return;
37+
}
38+
function isMissingReturnExpression4() {
39+
return;
40+
}
41+
function isMissingReturnExpression5(x) {
42+
if (x) {
43+
return 0;
44+
}
45+
else {
46+
return;
47+
}
48+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// @noImplicitReturns: true
2+
function isMissingReturnExpression(): number {
3+
return;
4+
}
5+
6+
function isMissingReturnExpression2(): any {
7+
return;
8+
}
9+
10+
function isMissingReturnExpression3(): number|void {
11+
return;
12+
}
13+
14+
function isMissingReturnExpression4(): void {
15+
return;
16+
}
17+
18+
function isMissingReturnExpression5(x) {
19+
if (x) {
20+
return 0;
21+
}
22+
else {
23+
return;
24+
}
25+
}

0 commit comments

Comments
 (0)