mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 14:00:35 +00:00
tuple unpacking is not enforced in for loops anymore
This commit is contained in:
@@ -447,14 +447,16 @@ proc semFor(c: PContext, n: PNode): PNode =
|
||||
result = semForFields(c, n, call.sons[0].sym.magic)
|
||||
else:
|
||||
var iter = skipTypes(n.sons[length-2].typ, {tyGenericInst})
|
||||
if iter.kind != tyTuple:
|
||||
# length == 3 means that there is one for loop variable
|
||||
# and thus no tuple unpacking:
|
||||
if iter.kind != tyTuple or length == 3:
|
||||
if length != 3: GlobalError(n.info, errWrongNumberOfVariables)
|
||||
var v = newSymS(skForVar, n.sons[0], c)
|
||||
v.typ = iter
|
||||
n.sons[0] = newSymNode(v)
|
||||
addDecl(c, v)
|
||||
else:
|
||||
if length-2 != sonsLen(iter):
|
||||
if length-2 != sonsLen(iter):
|
||||
GlobalError(n.info, errWrongNumberOfVariables)
|
||||
for i in countup(0, length - 3):
|
||||
var v = newSymS(skForVar, n.sons[i], c)
|
||||
|
||||
@@ -305,7 +305,10 @@ proc introduceNewLocalVars(c: PTransf, n: PNode): PTransNode =
|
||||
proc transformYield(c: PTransf, n: PNode): PTransNode =
|
||||
result = newTransNode(nkStmtList, n.info, 0)
|
||||
var e = n.sons[0]
|
||||
if skipTypes(e.typ, {tyGenericInst}).kind == tyTuple:
|
||||
# c.transCon.forStmt.len == 3 means that there is one for loop variable
|
||||
# and thus no tuple unpacking:
|
||||
if skipTypes(e.typ, {tyGenericInst}).kind == tyTuple and
|
||||
c.transCon.forStmt.len != 3:
|
||||
e = skipConv(e)
|
||||
if e.kind == nkPar:
|
||||
for i in countup(0, sonsLen(e) - 1):
|
||||
|
||||
18
tests/accept/compile/tgenericmatcher2.nim
Normal file
18
tests/accept/compile/tgenericmatcher2.nim
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
type
|
||||
TMatcherKind = enum
|
||||
mkTerminal, mkSequence, mkAlternation, mkRepeat
|
||||
TMatcher[T] = object
|
||||
case kind: TMatcherKind
|
||||
of mkTerminal:
|
||||
value: T
|
||||
of mkSequence, mkAlternation:
|
||||
matchers: seq[TMatcher[T]]
|
||||
of mkRepeat:
|
||||
matcher: ref TMatcher[T]
|
||||
min, max: int
|
||||
|
||||
var
|
||||
m: ref TMatcher[int]
|
||||
|
||||
|
||||
13
tests/accept/compile/titer_no_tuple_unpack.nim
Normal file
13
tests/accept/compile/titer_no_tuple_unpack.nim
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
iterator xrange(fromm, to: int, step = 1): tuple[x, y: int] =
|
||||
var a = fromm
|
||||
while a <= to:
|
||||
yield (a, a+1)
|
||||
inc(a, step)
|
||||
|
||||
for a, b in xrange(3, 7):
|
||||
echo a, " ", b
|
||||
|
||||
for tup in xrange(3, 7):
|
||||
echo tup
|
||||
|
||||
1
todo.txt
1
todo.txt
@@ -3,7 +3,6 @@ High priority (version 0.8.12)
|
||||
* implement message passing built-ins
|
||||
|
||||
* add --deadlock_prevention:on|off switch? timeout for locks?
|
||||
* iterators should not always be destructive!
|
||||
* real types for template results
|
||||
* built-in serialization
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ Additions
|
||||
returns a ``TFile`` and raises an exception in case of an error.
|
||||
- The compiler now might use hashing for string case statements depending
|
||||
on the number of string literals in the case statement.
|
||||
- Tuple unpacking is not enforced in ``for`` loops anymore.
|
||||
- Added a wrapper for ``redis``.
|
||||
- Added a wrapper for ``0mq`` via the ``zmq`` module.
|
||||
- Added a wrapper for ``sphinx``.
|
||||
|
||||
Reference in New Issue
Block a user