diff options
-rwxr-xr-x | compiler/semstmts.nim | 2 | ||||
-rwxr-xr-x | compiler/sigmatch.nim | 12 | ||||
-rw-r--r-- | tests/compile/tprocvars.nim | 6 |
3 files changed, 13 insertions, 7 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 2d36015a7..2789c068b 100755 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1139,7 +1139,7 @@ proc semStmtList(c: PContext, n: PNode): PNode = # a statement list (s; e) has the type 'e': if result.kind == nkStmtList and result.len > 0: var lastStmt = lastSon(result) - if not ImplicitelyDiscardable(lastStmt): + if lastStmt.kind != nkNilLit and not ImplicitelyDiscardable(lastStmt): result.typ = lastStmt.typ #localError(lastStmt.info, errGenerated, # "Last expression must be explicitly returned if it " & diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index cfae74119..8968e4e03 100755 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -279,24 +279,24 @@ proc procTypeRel(c: var TCandidate, f, a: PType): TTypeRelation = var m = typeRel(c, f.sons[0], a.sons[0]) # Subtype is sufficient for return types! if m < isSubtype or inconsistentVarTypes(f.sons[0], a.sons[0]): - result = isNone + return isNone elif m == isSubtype: result = isConvertible else: result = minRel(m, result) else: - result = isNone + return isNone elif a.sons[0] != nil: - result = isNone + return isNone if tfNoSideEffect in f.flags and tfNoSideEffect notin a.flags: - result = isNone + return isNone elif tfThread in f.flags and a.flags * {tfThread, tfNoSideEffect} == {}: # noSideEffect implies ``tfThread``! XXX really? - result = isNone + return isNone elif f.callconv != a.callconv: # valid to pass a 'nimcall' thingie to 'closure': if f.callconv == ccClosure and a.callconv == ccDefault: result = isConvertible else: - result = isNone + return isNone else: nil proc matchTypeClass(c: var TCandidate, f, a: PType): TTypeRelation = diff --git a/tests/compile/tprocvars.nim b/tests/compile/tprocvars.nim new file mode 100644 index 000000000..dc7592526 --- /dev/null +++ b/tests/compile/tprocvars.nim @@ -0,0 +1,6 @@ +proc doSomething(v: Int, x: proc(v:Int):Int): Int = return x(v) +proc doSomething(v: Int, x: proc(v:Int)) = x(v) + + +echo doSomething(10, proc(v: Int): Int = return v div 2) + |