@@ -327,6 +327,7 @@ class Checker {
327
327
var currentFunType : TType ;
328
328
var isCompletion : Bool ;
329
329
var allowDefine : Bool ;
330
+ var hasReturn : Bool ;
330
331
public var allowAsync : Bool ;
331
332
public var allowReturn : Null <TType >;
332
333
public var allowGlobalsDefine : Bool ;
@@ -1088,6 +1089,7 @@ class Checker {
1088
1089
return TVoid ;
1089
1090
case EReturn (v ):
1090
1091
var et = v == null ? TVoid : typeExpr (v , allowReturn == null ? Value : WithType (allowReturn ));
1092
+ hasReturn = true ;
1091
1093
if ( allowReturn == null )
1092
1094
error (" Return not allowed here" , expr );
1093
1095
else
@@ -1130,8 +1132,10 @@ class Checker {
1130
1132
var locals = saveLocals ();
1131
1133
var oldRet = allowReturn ;
1132
1134
var oldGDef = allowDefine ;
1135
+ var oldHasRet = hasReturn ;
1133
1136
allowReturn = tret ;
1134
1137
allowDefine = false ;
1138
+ hasReturn = false ;
1135
1139
var withArgs = null ;
1136
1140
if ( name != null && ! withType .match (WithType (follow (_ ) => TFun (_ ))) ) {
1137
1141
var ev = events .get (name );
@@ -1156,8 +1160,11 @@ class Checker {
1156
1160
if ( withArgs != null && targs .length < withArgs .length )
1157
1161
error (" Missing " + (withArgs .length - targs .length )+ " arguments (" + [for ( i in targs .length ... withArgs .length ) typeStr (withArgs [i ].t )].join (" ," )+ " )" , expr );
1158
1162
typeExpr (body ,NoValue );
1163
+ if ( ! hasReturn && ! tryUnify (tret , TVoid ) )
1164
+ error (" Missing return " + typeStr (tret ), expr );
1159
1165
allowDefine = oldGDef ;
1160
1166
allowReturn = oldRet ;
1167
+ hasReturn = oldHasRet ;
1161
1168
this .locals = locals ;
1162
1169
if ( ft == null ) {
1163
1170
ft = TFun (targs , tret );
0 commit comments