mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
fixes #2481
This commit is contained in:
@@ -43,7 +43,8 @@ type
|
||||
inst*: PInstantiation
|
||||
|
||||
TExprFlag* = enum
|
||||
efLValue, efWantIterator, efInTypeof, efWantStmt, efDetermineType,
|
||||
efLValue, efWantIterator, efInTypeof,
|
||||
efWantStmt, efAllowStmt, efDetermineType,
|
||||
efAllowDestructor, efWantValue, efOperand, efNoSemCheck
|
||||
TExprFlags* = set[TExprFlag]
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ proc semOperand(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||
if result.typ != nil:
|
||||
# XXX tyGenericInst here?
|
||||
if result.typ.kind == tyVar: result = newDeref(result)
|
||||
elif efWantStmt in flags:
|
||||
elif {efWantStmt, efAllowStmt} * flags != {}:
|
||||
result.typ = newTypeS(tyEmpty, c)
|
||||
else:
|
||||
localError(n.info, errExprXHasNoType,
|
||||
|
||||
@@ -1422,9 +1422,12 @@ proc prepareOperand(c: PContext; formal: PType; a: PNode): PNode =
|
||||
# a.typ == nil is valid
|
||||
result = a
|
||||
elif a.typ.isNil:
|
||||
# XXX This is unsound! 'formal' can differ from overloaded routine to
|
||||
# overloaded routine!
|
||||
let flags = if formal.kind == tyIter: {efDetermineType, efWantIterator}
|
||||
elif formal.kind == tyStmt: {efDetermineType, efWantStmt}
|
||||
else: {efDetermineType}
|
||||
else: {efDetermineType, efAllowStmt}
|
||||
#elif formal.kind == tyStmt: {efDetermineType, efWantStmt}
|
||||
#else: {efDetermineType}
|
||||
result = c.semOperand(c, a, flags)
|
||||
else:
|
||||
result = a
|
||||
|
||||
38
tests/overload/tstmtoverload.nim
Normal file
38
tests/overload/tstmtoverload.nim
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
# bug #2481
|
||||
import math
|
||||
|
||||
template test(loopCount: int, extraI: int, testBody: stmt): stmt =
|
||||
block:
|
||||
for i in 0..loopCount-1:
|
||||
testBody
|
||||
echo "done extraI=", extraI
|
||||
|
||||
template test(loopCount: int, extraF: float, testBody: stmt): stmt =
|
||||
block:
|
||||
test(loopCount, round(extraF), testBody)
|
||||
|
||||
template test(loopCount: int, testBody: stmt): stmt =
|
||||
block:
|
||||
test(loopCount, 0, testBody)
|
||||
echo "done extraI passed 0"
|
||||
|
||||
when isMainModule:
|
||||
var
|
||||
loops = 0
|
||||
|
||||
test 0, 0:
|
||||
loops += 1
|
||||
echo "test 0 complete, loops=", loops
|
||||
|
||||
test 1, 1.0:
|
||||
loops += 1
|
||||
echo "test 1.0 complete, loops=", loops
|
||||
|
||||
when true:
|
||||
# when true we get the following compile time error:
|
||||
# b.nim(35, 6) Error: expression 'loops += 1' has no type (or is ambiguous)
|
||||
loops = 0
|
||||
test 2:
|
||||
loops += 1
|
||||
echo "test no extra complete, loops=", loops
|
||||
Reference in New Issue
Block a user