This commit is contained in:
Araq 2012-10-13 01:59:20 +02:00
commit ffcbe19cd8
3 changed files with 13 additions and 7 deletions

View file

@ -1139,7 +1139,7 @@ proc semStmtList(c: PContext, n: PNode): PNode =
# a statement list (s; e) has the type 'e': # a statement list (s; e) has the type 'e':
if result.kind == nkStmtList and result.len > 0: if result.kind == nkStmtList and result.len > 0:
var lastStmt = lastSon(result) var lastStmt = lastSon(result)
if not ImplicitelyDiscardable(lastStmt): if lastStmt.kind != nkNilLit and not ImplicitelyDiscardable(lastStmt):
result.typ = lastStmt.typ result.typ = lastStmt.typ
#localError(lastStmt.info, errGenerated, #localError(lastStmt.info, errGenerated,
# "Last expression must be explicitly returned if it " & # "Last expression must be explicitly returned if it " &

View file

@ -279,24 +279,24 @@ proc procTypeRel(c: var TCandidate, f, a: PType): TTypeRelation =
var m = typeRel(c, f.sons[0], a.sons[0]) var m = typeRel(c, f.sons[0], a.sons[0])
# Subtype is sufficient for return types! # Subtype is sufficient for return types!
if m < isSubtype or inconsistentVarTypes(f.sons[0], a.sons[0]): if m < isSubtype or inconsistentVarTypes(f.sons[0], a.sons[0]):
result = isNone return isNone
elif m == isSubtype: result = isConvertible elif m == isSubtype: result = isConvertible
else: result = minRel(m, result) else: result = minRel(m, result)
else: else:
result = isNone return isNone
elif a.sons[0] != nil: elif a.sons[0] != nil:
result = isNone return isNone
if tfNoSideEffect in f.flags and tfNoSideEffect notin a.flags: if tfNoSideEffect in f.flags and tfNoSideEffect notin a.flags:
result = isNone return isNone
elif tfThread in f.flags and a.flags * {tfThread, tfNoSideEffect} == {}: elif tfThread in f.flags and a.flags * {tfThread, tfNoSideEffect} == {}:
# noSideEffect implies ``tfThread``! XXX really? # noSideEffect implies ``tfThread``! XXX really?
result = isNone return isNone
elif f.callconv != a.callconv: elif f.callconv != a.callconv:
# valid to pass a 'nimcall' thingie to 'closure': # valid to pass a 'nimcall' thingie to 'closure':
if f.callconv == ccClosure and a.callconv == ccDefault: if f.callconv == ccClosure and a.callconv == ccDefault:
result = isConvertible result = isConvertible
else: else:
result = isNone return isNone
else: nil else: nil
proc matchTypeClass(c: var TCandidate, f, a: PType): TTypeRelation = proc matchTypeClass(c: var TCandidate, f, a: PType): TTypeRelation =

View file

@ -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)