fixes #2481
This commit is contained in:
parent
10c1d7f519
commit
49471440eb
4 changed files with 46 additions and 4 deletions
|
|
@ -43,7 +43,8 @@ type
|
||||||
inst*: PInstantiation
|
inst*: PInstantiation
|
||||||
|
|
||||||
TExprFlag* = enum
|
TExprFlag* = enum
|
||||||
efLValue, efWantIterator, efInTypeof, efWantStmt, efDetermineType,
|
efLValue, efWantIterator, efInTypeof,
|
||||||
|
efWantStmt, efAllowStmt, efDetermineType,
|
||||||
efAllowDestructor, efWantValue, efOperand, efNoSemCheck
|
efAllowDestructor, efWantValue, efOperand, efNoSemCheck
|
||||||
TExprFlags* = set[TExprFlag]
|
TExprFlags* = set[TExprFlag]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ proc semOperand(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
|
||||||
if result.typ != nil:
|
if result.typ != nil:
|
||||||
# XXX tyGenericInst here?
|
# XXX tyGenericInst here?
|
||||||
if result.typ.kind == tyVar: result = newDeref(result)
|
if result.typ.kind == tyVar: result = newDeref(result)
|
||||||
elif efWantStmt in flags:
|
elif {efWantStmt, efAllowStmt} * flags != {}:
|
||||||
result.typ = newTypeS(tyEmpty, c)
|
result.typ = newTypeS(tyEmpty, c)
|
||||||
else:
|
else:
|
||||||
localError(n.info, errExprXHasNoType,
|
localError(n.info, errExprXHasNoType,
|
||||||
|
|
|
||||||
|
|
@ -1422,9 +1422,12 @@ proc prepareOperand(c: PContext; formal: PType; a: PNode): PNode =
|
||||||
# a.typ == nil is valid
|
# a.typ == nil is valid
|
||||||
result = a
|
result = a
|
||||||
elif a.typ.isNil:
|
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}
|
let flags = if formal.kind == tyIter: {efDetermineType, efWantIterator}
|
||||||
elif formal.kind == tyStmt: {efDetermineType, efWantStmt}
|
else: {efDetermineType, efAllowStmt}
|
||||||
else: {efDetermineType}
|
#elif formal.kind == tyStmt: {efDetermineType, efWantStmt}
|
||||||
|
#else: {efDetermineType}
|
||||||
result = c.semOperand(c, a, flags)
|
result = c.semOperand(c, a, flags)
|
||||||
else:
|
else:
|
||||||
result = a
|
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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue