diff --git a/compiler/src/dmd/statementsem.d b/compiler/src/dmd/statementsem.d index cb31b0fe1c..4c36055f6a 100644 --- a/compiler/src/dmd/statementsem.d +++ b/compiler/src/dmd/statementsem.d @@ -2603,7 +2603,7 @@ Statement statementSemanticVisit(Statement s, Scope* sc) if (tbret && tbret.ty == Tvoid || convToVoid) { - if (!convToVoid) + if (!convToVoid && !texp.isTypeError()) { error(rs.loc, "cannot return non-void from `void` function"); errors = true; diff --git a/compiler/test/fail_compilation/diag10405.d b/compiler/test/fail_compilation/diag10405.d deleted file mode 100644 index 28da8af93a..0000000000 --- a/compiler/test/fail_compilation/diag10405.d +++ /dev/null @@ -1,11 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/diag10405.d(10): Error: cannot return non-void from `void` function ---- -*/ - -void main() -{ - return 10; -} diff --git a/compiler/test/fail_compilation/diag20888.d b/compiler/test/fail_compilation/diag20888.d index 84af42533f..d030a98ec2 100644 --- a/compiler/test/fail_compilation/diag20888.d +++ b/compiler/test/fail_compilation/diag20888.d @@ -13,12 +13,12 @@ fail_compilation/diag20888.d(49): Error: return value `callback` of type `int de fail_compilation/diag20888.d(54): Error: return value `() => 3755` of type `int function() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted fail_compilation/diag20888.d(54): Did you intend to call the function pointer? fail_compilation/diag20888.d(59): Error: `return` expression expected -fail_compilation/diag20888.d(64): Error: cannot return non-void from `void` function fail_compilation/diag20888.d(70): Error: return value `() => i` of type `int delegate() pure nothrow @nogc @safe` does not match return type `int`, and cannot be implicitly converted fail_compilation/diag20888.d(70): Did you intend to call the delegate? --- */ + int alpha(int function() callback) { return callback; @@ -59,10 +59,10 @@ int theta() return; } -void iota() -{ - return 0xEAB; -} + + + + int kappa() { diff --git a/compiler/test/fail_compilation/fail305.d b/compiler/test/fail_compilation/fail305.d deleted file mode 100644 index aef1624a07..0000000000 --- a/compiler/test/fail_compilation/fail305.d +++ /dev/null @@ -1,11 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/fail305.d(10): Error: cannot return non-void from `void` function ---- -*/ - -void main() -{ - return "a"; -} diff --git a/compiler/test/fail_compilation/fail41.d b/compiler/test/fail_compilation/fail41.d deleted file mode 100644 index 6d89395053..0000000000 --- a/compiler/test/fail_compilation/fail41.d +++ /dev/null @@ -1,18 +0,0 @@ -/* -TEST_OUTPUT: ---- -fail_compilation/fail41.d(17): Error: cannot return non-void from `void` function ---- -*/ - -class MyClass -{ -} - -MyClass[char[]] myarray; - -void fn() -{ - foreach (MyClass mc; myarray) - return mc; -} diff --git a/compiler/test/fail_compilation/nonvoid_return.d b/compiler/test/fail_compilation/nonvoid_return.d new file mode 100644 index 0000000000..bcced1b9bf --- /dev/null +++ b/compiler/test/fail_compilation/nonvoid_return.d @@ -0,0 +1,37 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/nonvoid_return.d(15): Error: cannot return non-void from `void` function +fail_compilation/nonvoid_return.d(18): Error: cannot return non-void from `void` function +fail_compilation/nonvoid_return.d(29): Error: cannot return non-void from `void` function +fail_compilation/nonvoid_return.d(32): Error: undefined identifier `NONEXISTENT` +--- +*/ + + + +void main() +{ + return 10; +} + +void fs() => "a"; + +class MyClass +{ +} + +MyClass[char[]] myarray; + +void fn() +{ + foreach (MyClass mc; myarray) + return mc; +} + +auto err() { NONEXISTENT++; } + +// Because `err` contains an error, it fails to infer void and gets an error return type +// Don't print the 'cannot return non-void' error in this case + +void fe() => err;