diff options
Diffstat (limited to 'compiler')
69 files changed, 605 insertions, 550 deletions
diff --git a/compiler/aliases.nim b/compiler/aliases.nim index f79210dd7..ef56c5d6c 100644 --- a/compiler/aliases.nim +++ b/compiler/aliases.nim @@ -22,14 +22,14 @@ proc isPartOfAux(n: PNode, b: PType, marker: var IntSet): TAnalysisResult = result = arNo case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = isPartOfAux(n.sons[i], b, marker) if result == arYes: return of nkRecCase: assert(n.sons[0].kind == nkSym) result = isPartOfAux(n.sons[0], b, marker) if result == arYes: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = isPartOfAux(lastSon(n.sons[i]), b, marker) @@ -52,7 +52,7 @@ proc isPartOfAux(a, b: PType, marker: var IntSet): TAnalysisResult = of tyGenericInst, tyDistinct, tyAlias, tySink: result = isPartOfAux(lastSon(a), b, marker) of tyArray, tySet, tyTuple: - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): result = isPartOfAux(a.sons[i], b, marker) if result == arYes: return else: discard diff --git a/compiler/ast.nim b/compiler/ast.nim index aeb19ae1a..ee90c566b 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -768,6 +768,8 @@ type lfHeader, # include header file for symbol lfImportCompilerProc, # ``importc`` of a compilerproc lfSingleUse # no location yet and will only be used once + lfEnforceDeref # a copyMem is required to dereference if this a + # ptr array due to C array limitations. See #1181, #6422, #11171 TStorageLoc* = enum OnUnknown, # location is unknown (stack, heap or static) OnStatic, # in a static section @@ -1156,17 +1158,17 @@ const # for all kind of hash tables: proc copyStrTable*(dest: var TStrTable, src: TStrTable) = dest.counter = src.counter setLen(dest.data, len(src.data)) - for i in countup(0, high(src.data)): dest.data[i] = src.data[i] + for i in 0 .. high(src.data): dest.data[i] = src.data[i] proc copyIdTable*(dest: var TIdTable, src: TIdTable) = dest.counter = src.counter newSeq(dest.data, len(src.data)) - for i in countup(0, high(src.data)): dest.data[i] = src.data[i] + for i in 0 .. high(src.data): dest.data[i] = src.data[i] proc copyObjectSet*(dest: var TObjectSet, src: TObjectSet) = dest.counter = src.counter setLen(dest.data, len(src.data)) - for i in countup(0, high(src.data)): dest.data[i] = src.data[i] + for i in 0 .. high(src.data): dest.data[i] = src.data[i] proc discardSons*(father: PNode) = when defined(nimNoNilSeqs): @@ -1355,7 +1357,7 @@ proc assignType*(dest, src: PType) = else: dest.sym = src.sym newSons(dest, sonsLen(src)) - for i in countup(0, sonsLen(src) - 1): dest.sons[i] = src.sons[i] + for i in 0 ..< sonsLen(src): dest.sons[i] = src.sons[i] proc copyType*(t: PType, owner: PSym, keepId: bool): PType = result = newType(t.kind, owner) @@ -1518,7 +1520,7 @@ proc delSon*(father: PNode, idx: int) = else: if isNil(father.sons): return var length = sonsLen(father) - for i in countup(idx, length - 2): father.sons[i] = father.sons[i + 1] + for i in idx .. length - 2: father.sons[i] = father.sons[i + 1] setLen(father.sons, length - 1) proc copyNode*(src: PNode): PNode = @@ -1580,17 +1582,17 @@ proc copyTree*(src: PNode): PNode = of nkStrLit..nkTripleStrLit: result.strVal = src.strVal else: newSeq(result.sons, sonsLen(src)) - for i in countup(0, sonsLen(src) - 1): + for i in 0 ..< sonsLen(src): result.sons[i] = copyTree(src.sons[i]) proc hasSonWith*(n: PNode, kind: TNodeKind): bool = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.sons[i].kind == kind: return true result = false proc hasNilSon*(n: PNode): bool = - for i in countup(0, safeLen(n) - 1): + for i in 0 ..< safeLen(n): if n.sons[i] == nil: return true elif hasNilSon(n.sons[i]): @@ -1602,14 +1604,14 @@ proc containsNode*(n: PNode, kinds: TNodeKinds): bool = case n.kind of nkEmpty..nkNilLit: result = n.kind in kinds else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.kind in kinds or containsNode(n.sons[i], kinds): return true proc hasSubnodeWith*(n: PNode, kind: TNodeKind): bool = case n.kind of nkEmpty..nkNilLit: result = n.kind == kind else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if (n.sons[i].kind == kind) or hasSubnodeWith(n.sons[i], kind): return true result = false diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim index 4c16e8501..280022780 100644 --- a/compiler/astalgo.nim +++ b/compiler/astalgo.nim @@ -152,14 +152,14 @@ proc lookupInRecord(n: PNode, field: PIdent): PSym = result = nil case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = lookupInRecord(n.sons[i], field) if result != nil: return of nkRecCase: if (n.sons[0].kind != nkSym): return nil result = lookupInRecord(n.sons[0], field) if result != nil: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = lookupInRecord(lastSon(n.sons[i]), field) @@ -175,7 +175,7 @@ proc getModule*(s: PSym): PSym = while result != nil and result.kind != skModule: result = result.owner proc getSymFromList(list: PNode, ident: PIdent, start: int = 0): PSym = - for i in countup(start, sonsLen(list) - 1): + for i in start ..< sonsLen(list): if list.sons[i].kind == nkSym: result = list.sons[i].sym if result.name.id == ident.id: return @@ -281,7 +281,7 @@ proc typeToYamlAux(conf: ConfigRef; n: PType, marker: var IntSet, indent: int, else: if sonsLen(n) > 0: sonsRope = rope("[") - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: add(sonsRope, ",") addf(sonsRope, "$N$1$2", [rspaces(indent + 4), typeToYamlAux(conf, n.sons[i], marker, indent + 4, maxRecDepth - 1)]) @@ -330,7 +330,7 @@ proc treeToYamlAux(conf: ConfigRef; n: PNode, marker: var IntSet, indent: int, else: if sonsLen(n) > 0: addf(result, ",$N$1\"sons\": [", [istr]) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: add(result, ",") addf(result, "$N$1$2", [rspaces(indent + 4), treeToYamlAux(conf, n.sons[i], marker, indent + 4, maxRecDepth - 1)]) @@ -630,7 +630,7 @@ proc objectSetRawInsert(data: var TObjectSeq, obj: RootRef) = proc objectSetEnlarge(t: var TObjectSet) = var n: TObjectSeq newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i] != nil: objectSetRawInsert(n, t.data[i]) swap(t.data, n) @@ -709,7 +709,7 @@ proc symTabReplace*(t: var TStrTable, prevSym: PSym, newSym: PSym) = proc strTableEnlarge(t: var TStrTable) = var n: seq[PSym] newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i] != nil: strTableRawInsert(n, t.data[i]) swap(t.data, n) @@ -845,7 +845,7 @@ iterator items*(tab: TStrTable): PSym = s = nextIter(it, tab) proc hasEmptySlot(data: TIdPairSeq): bool = - for h in countup(0, high(data)): + for h in 0 .. high(data): if data[h].key == nil: return true result = false @@ -900,7 +900,7 @@ proc idTablePut(t: var TIdTable, key: PIdObj, val: RootRef) = else: if mustRehash(len(t.data), t.counter): newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i].key != nil: idTableRawInsert(n, t.data[i].key, t.data[i].val) assert(hasEmptySlot(n)) @@ -946,7 +946,7 @@ proc idNodeTablePut(t: var TIdNodeTable, key: PIdObj, val: PNode) = if mustRehash(len(t.data), t.counter): var n: TIdNodePairSeq newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i].key != nil: idNodeTableRawInsert(n, t.data[i].key, t.data[i].val) swap(t.data, n) @@ -960,7 +960,7 @@ iterator pairs*(t: TIdNodeTable): tuple[key: PIdObj, val: PNode] = proc initIITable(x: var TIITable) = x.counter = 0 newSeq(x.data, StartSize) - for i in countup(0, StartSize - 1): x.data[i].key = InvalidKey + for i in 0 ..< StartSize: x.data[i].key = InvalidKey proc iiTableRawGet(t: TIITable, key: int): int = var h: Hash @@ -994,8 +994,8 @@ proc iiTablePut(t: var TIITable, key, val: int) = if mustRehash(len(t.data), t.counter): var n: TIIPairSeq newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(n)): n[i].key = InvalidKey - for i in countup(0, high(t.data)): + for i in 0 .. high(n): n[i].key = InvalidKey + for i in 0 .. high(t.data): if t.data[i].key != InvalidKey: iiTableRawInsert(n, t.data[i].key, t.data[i].val) swap(t.data, n) @@ -1008,4 +1008,4 @@ proc isAddrNode*(n: PNode): bool = of nkCallKinds: if n[0].kind == nkSym and n[0].sym.magic == mAddr: true else: false - else: false \ No newline at end of file + else: false diff --git a/compiler/bitsets.nim b/compiler/bitsets.nim index e38732877..0f12da95f 100644 --- a/compiler/bitsets.nim +++ b/compiler/bitsets.nim @@ -48,25 +48,25 @@ proc bitSetInit(b: var TBitSet, length: int) = newSeq(b, length) proc bitSetUnion(x: var TBitSet, y: TBitSet) = - for i in countup(0, high(x)): x[i] = x[i] or y[i] + for i in 0 .. high(x): x[i] = x[i] or y[i] proc bitSetDiff(x: var TBitSet, y: TBitSet) = - for i in countup(0, high(x)): x[i] = x[i] and not y[i] + for i in 0 .. high(x): x[i] = x[i] and not y[i] proc bitSetSymDiff(x: var TBitSet, y: TBitSet) = - for i in countup(0, high(x)): x[i] = x[i] xor y[i] + for i in 0 .. high(x): x[i] = x[i] xor y[i] proc bitSetIntersect(x: var TBitSet, y: TBitSet) = - for i in countup(0, high(x)): x[i] = x[i] and y[i] + for i in 0 .. high(x): x[i] = x[i] and y[i] proc bitSetEquals(x, y: TBitSet): bool = - for i in countup(0, high(x)): + for i in 0 .. high(x): if x[i] != y[i]: return false result = true proc bitSetContains(x, y: TBitSet): bool = - for i in countup(0, high(x)): + for i in 0 .. high(x): if (x[i] and not y[i]) != int8(0): return false result = true diff --git a/compiler/canonicalizer.nim b/compiler/canonicalizer.nim index 2b6096298..8c418b790 100644 --- a/compiler/canonicalizer.nim +++ b/compiler/canonicalizer.nim @@ -120,7 +120,7 @@ proc hashType(c: var MD5Context, t: PType) = case t.kind of tyGenericBody, tyGenericInst, tyGenericInvocation: - for i in countup(0, sonsLen(t) -1 -ord(t.kind != tyGenericInvocation)): + for i in 0 ..< sonsLen(t)-ord(t.kind != tyGenericInvocation): c.hashType t.sons[i] of tyUserTypeClass: internalAssert t.sym != nil and t.sym.owner != nil @@ -128,7 +128,7 @@ proc hashType(c: var MD5Context, t: PType) = of tyUserTypeClassInst: let body = t.base c.hashSym body.sym - for i in countup(1, sonsLen(t) - 2): + for i in 1 .. sonsLen(t) - 2: c.hashType t.sons[i] of tyFromExpr: c.hashTree(t.n) @@ -138,14 +138,14 @@ proc hashType(c: var MD5Context, t: PType) = of tyTuple: if t.n != nil: assert(sonsLen(t.n) == sonsLen(t)) - for i in countup(0, sonsLen(t.n) - 1): + for i in 0 ..< sonsLen(t.n): assert(t.n.sons[i].kind == nkSym) c &= t.n.sons[i].sym.name.s c &= ":" c.hashType(t.sons[i]) c &= "," else: - for i in countup(0, sonsLen(t) - 1): c.hashType t.sons[i] + for i in 0 ..< sonsLen(t): c.hashType t.sons[i] of tyRange: c.hashTree(t.n) c.hashType(t.sons[0]) @@ -238,7 +238,7 @@ proc encodeNode(w: PRodWriter, fInfo: TLineInfo, n: PNode, encodeVInt(n.sym.id, result) pushSym(w, n.sym) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): encodeNode(w, n.info, n.sons[i], result) add(result, ')') @@ -304,7 +304,7 @@ proc encodeType(w: PRodWriter, t: PType, result: var string) = add(result, '=') encodeVInt(t.align, result) encodeLoc(w, t.loc, result) - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): if t.sons[i] == nil: add(result, "^()") else: diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 1e856ad73..bea43b296 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -199,7 +199,7 @@ proc genPrefixCall(p: BProc, le, ri: PNode, d: var TLoc) = assert(typ.kind == tyProc) assert(sonsLen(typ) == sonsLen(typ.n)) var length = sonsLen(ri) - for i in countup(1, length - 1): + for i in 1 ..< length: genParamLoop(params) var callee = rdLoc(op) if p.hcrOn and ri.sons[0].kind == nkSym: @@ -223,7 +223,7 @@ proc genClosureCall(p: BProc, le, ri: PNode, d: var TLoc) = var typ = skipTypes(ri.sons[0].typ, abstractInst) assert(typ.kind == tyProc) var length = sonsLen(ri) - for i in countup(1, length - 1): + for i in 1 ..< length: assert(sonsLen(typ) == sonsLen(typ.n)) genParamLoop(pl) @@ -470,7 +470,7 @@ proc genInfixCall(p: BProc, le, ri: PNode, d: var TLoc) = add(pl, genThisArg(p, ri, 1, typ)) add(pl, op.r) var params: Rope - for i in countup(2, length - 1): + for i in 2 ..< length: if params != nil: params.add(~", ") assert(sonsLen(typ) == sonsLen(typ.n)) add(params, genOtherArg(p, ri, i, typ)) @@ -506,7 +506,7 @@ proc genNamedParamCall(p: BProc, ri: PNode, d: var TLoc) = if length > 2: add(pl, ~": ") add(pl, genArg(p, ri.sons[2], typ.n.sons[2].sym, ri)) - for i in countup(start, length-1): + for i in start ..< length: assert(sonsLen(typ) == sonsLen(typ.n)) if i >= sonsLen(typ): internalError(p.config, ri.info, "varargs for objective C method?") diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index e03c4b1c1..ec32f5975 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -101,7 +101,7 @@ proc bitSetToWord(s: TBitSet, size: int): BiggestInt = proc genRawSetData(cs: TBitSet, size: int): Rope = if size > 8: result = "{$n" % [] - for i in countup(0, size - 1): + for i in 0 ..< size: if i < size - 1: # not last iteration? if (i + 1) mod 8 == 0: @@ -717,13 +717,11 @@ proc isCppRef(p: BProc; typ: PType): bool {.inline.} = skipTypes(typ, abstractInstOwned).kind == tyVar and tfVarIsPtr notin skipTypes(typ, abstractInstOwned).flags -proc genDeref(p: BProc, e: PNode, d: var TLoc; enforceDeref=false) = +proc genDeref(p: BProc, e: PNode, d: var TLoc) = let mt = mapType(p.config, e.sons[0].typ) - if mt in {ctArray, ctPtrToArray} and not enforceDeref: + if mt in {ctArray, ctPtrToArray} and lfEnforceDeref notin d.flags: # XXX the amount of hacks for C's arrays is incredible, maybe we should # simply wrap them in a struct? --> Losing auto vectorization then? - #if e[0].kind != nkBracketExpr: - # message(e.info, warnUser, "CAME HERE " & renderTree(e)) expr(p, e.sons[0], d) if e.sons[0].typ.skipTypes(abstractInstOwned).kind == tyRef: d.storage = OnHeap @@ -760,7 +758,7 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc; enforceDeref=false) = e.kind == nkHiddenDeref: putIntoDest(p, d, e, rdLoc(a), a.storage) return - if enforceDeref and mt == ctPtrToArray: + if mt == ctPtrToArray and lfEnforceDeref in d.flags: # we lie about the type for better C interop: 'ptr array[3,T]' is # translated to 'ptr T', but for deref'ing this produces wrong code. # See tmissingderef. So we get rid of the deref instead. The codegen @@ -847,7 +845,7 @@ proc genInExprAux(p: BProc, e: PNode, a, b, d: var TLoc) proc genFieldCheck(p: BProc, e: PNode, obj: Rope, field: PSym) = var test, u, v: TLoc - for i in countup(1, sonsLen(e) - 1): + for i in 1 ..< sonsLen(e): var it = e.sons[i] assert(it.kind in nkCallKinds) assert(it.sons[0].kind == nkSym) @@ -995,6 +993,7 @@ proc genBracketExpr(p: BProc; n: PNode; d: var TLoc) = of tyCString: genCStringElem(p, n, n.sons[0], n.sons[1], d) of tyTuple: genTupleElem(p, n, d) else: internalError(p.config, n.info, "expr(nkBracketExpr, " & $ty.kind & ')') + discard getTypeDesc(p.module, n.typ) proc isSimpleExpr(n: PNode): bool = # calls all the way down --> can stay expression based @@ -1131,7 +1130,7 @@ proc genStrConcat(p: BProc, e: PNode, d: var TLoc) = var L = 0 var appends: Rope = nil var lens: Rope = nil - for i in countup(0, sonsLen(e) - 2): + for i in 0 .. sonsLen(e) - 2: # compute the length expression: initLocExpr(p, e.sons[i + 1], a) if skipTypes(e.sons[i + 1].typ, abstractVarRange).kind == tyChar: @@ -1170,7 +1169,7 @@ proc genStrAppend(p: BProc, e: PNode, d: var TLoc) = assert(d.k == locNone) var L = 0 initLocExpr(p, e.sons[1], dest) - for i in countup(0, sonsLen(e) - 3): + for i in 0 .. sonsLen(e) - 3: # compute the length expression: initLocExpr(p, e.sons[i + 2], a) if skipTypes(e.sons[i + 2].typ, abstractVarRange).kind == tyChar: @@ -1448,7 +1447,7 @@ proc genSeqConstr(p: BProc, n: PNode, d: var TLoc) = # generate call to newSeq before adding the elements per hand: genNewSeqAux(p, dest[], l, optNilSeqs notin p.options and n.len == 0) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): initLoc(arr, locExpr, n[i], OnHeap) arr.r = ropecg(p.module, "$1$3[$2]", [rdLoc(dest[]), intLiteral(i), dataField(p)]) arr.storage = OnHeap # we know that sequences are on the heap @@ -1480,7 +1479,7 @@ proc genArrToSeq(p: BProc, n: PNode, d: var TLoc) = initLocExpr(p, n.sons[1], a) # bug #5007; do not produce excessive C source code: if L < 10: - for i in countup(0, L - 1): + for i in 0 ..< L: initLoc(elem, locExpr, lodeTyp elemType(skipTypes(n.typ, abstractInst)), OnHeap) elem.r = ropecg(p.module, "$1$3[$2]", [rdLoc(d), intLiteral(i), dataField(p)]) elem.storage = OnHeap # we know that sequences are on the heap @@ -1797,7 +1796,7 @@ proc genInOp(p: BProc, e: PNode, d: var TLoc) = var length = sonsLen(e.sons[1]) if length > 0: b.r = rope("(") - for i in countup(0, length - 1): + for i in 0 ..< length: let it = e.sons[1].sons[i] if it.kind == nkRange: initLocExpr(p, it.sons[0], x) @@ -1912,7 +1911,7 @@ proc genOrd(p: BProc, e: PNode, d: var TLoc) = proc genSomeCast(p: BProc, e: PNode, d: var TLoc) = const - ValueTypes = {tyTuple, tyObject, tyArray, tyOpenArray, tyVarargs} + ValueTypes = {tyTuple, tyObject, tyArray, tyOpenArray, tyVarargs, tyUncheckedArray} # we use whatever C gives us. Except if we have a value-type, we need to go # through its address: var a: TLoc @@ -2337,11 +2336,12 @@ proc genTupleConstr(p: BProc, n: PNode, d: var TLoc) = let t = n.typ discard getTypeDesc(p.module, t) # so that any fields are initialized if d.k == locNone: getTemp(p, t, d) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it.kind == nkExprColonExpr: it = it.sons[1] initLoc(rec, locExpr, it, d.storage) rec.r = "$1.Field$2" % [rdLoc(d), rope(i)] + rec.flags.incl(lfEnforceDeref) expr(p, it, rec) proc isConstClosure(n: PNode): bool {.inline.} = @@ -2378,7 +2378,7 @@ proc genArrayConstr(p: BProc, n: PNode, d: var TLoc) = var arr: TLoc if not handleConstExpr(p, n, d): if d.k == locNone: getTemp(p, n.typ, d) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): initLoc(arr, locExpr, lodeTyp elemType(skipTypes(n.typ, abstractInst)), d.storage) arr.r = "$1[$2]" % [rdLoc(d), intLiteral(i)] expr(p, n.sons[i], arr) @@ -2473,7 +2473,7 @@ proc downConv(p: BProc, n: PNode, d: var TLoc) = add(r, "->Sup") else: add(r, ".Sup") - for i in countup(2, abs(inheritanceDiff(dest, src))): add(r, ".Sup") + for i in 2 .. abs(inheritanceDiff(dest, src)): add(r, ".Sup") if isRef: # it can happen that we end up generating '&&x->Sup' here, so we pack # the '&x->Sup' into a temporary and then those address is taken @@ -2753,7 +2753,7 @@ proc getNullValueAux(p: BProc; t: PType; obj, cons: PNode, result: var Rope; cou getNullValueAux(p, t, it, cons, result, count) of nkRecCase: getNullValueAux(p, t, obj.sons[0], cons, result, count) - for i in countup(1, sonsLen(obj) - 1): + for i in 1 ..< sonsLen(obj): getNullValueAux(p, t, lastSon(obj.sons[i]), cons, result, count) of nkSym: if count > 0: result.add ", " @@ -2802,7 +2802,7 @@ proc genConstObjConstr(p: BProc; n: PNode): Rope = proc genConstSimpleList(p: BProc, n: PNode): Rope = var length = sonsLen(n) result = rope("{") - for i in countup(0, length - 2): + for i in 0 .. length - 2: addf(result, "$1,$n", [genNamedConstExpr(p, n.sons[i])]) if length > 0: add(result, genNamedConstExpr(p, n.sons[length - 1])) @@ -2813,7 +2813,7 @@ proc genConstSeq(p: BProc, n: PNode, t: PType): Rope = if n.len > 0: # array part needs extra curlies: data.add(", {") - for i in countup(0, n.len - 1): + for i in 0 ..< n.len: if i > 0: data.addf(",$n", []) data.add genConstExpr(p, n.sons[i]) data.add("}") @@ -2833,7 +2833,7 @@ proc genConstSeq(p: BProc, n: PNode, t: PType): Rope = proc genConstSeqV2(p: BProc, n: PNode, t: PType): Rope = var data = rope"{" - for i in countup(0, n.len - 1): + for i in 0 ..< n.len: if i > 0: data.addf(",$n", []) data.add genConstExpr(p, n.sons[i]) data.add("}") diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index abddb7c6c..7552f0c63 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -65,7 +65,7 @@ proc genVarTuple(p: BProc, n: PNode) = var L = sonsLen(n) # if we have a something that's been captured, use the lowering instead: - for i in countup(0, L-3): + for i in 0 .. L-3: if n[i].kind != nkSym: genStmts(p, lowerTupleUnpacking(p.module.g.graph, n, p.prc)) return @@ -83,23 +83,11 @@ proc genVarTuple(p: BProc, n: PNode) = # check with the boolean if the initializing code for the tuple should be ran lineCg(p, cpsStmts, "if ($1)$n", [hcrCond]) startBlock(p) - defer: - if forHcr: - # end the block where the tuple gets initialized - endBlock(p) - if forHcr or isGlobalInBlock: - # insert the registration of the globals for the different parts of the tuple at the - # start of the current scope (after they have been iterated) and init a boolean to - # check if any of them is newly introduced and the initializing code has to be ran - lineCg(p, cpsLocals, "NIM_BOOL $1 = NIM_FALSE;$n", [hcrCond]) - for curr in hcrGlobals: - lineCg(p, cpsLocals, "$1 |= hcrRegisterGlobal($4, \"$2\", sizeof($3), $5, (void**)&$2);$N", - [hcrCond, curr.loc.r, rdLoc(curr.loc), getModuleDllPath(p.module, n.sons[0].sym), curr.tp]) genLineDir(p, n) initLocExpr(p, n.sons[L-1], tup) var t = tup.t.skipTypes(abstractInst) - for i in countup(0, L-3): + for i in 0 .. L-3: let vn = n.sons[i] let v = vn.sym if sfCompileTime in v.flags: continue @@ -123,13 +111,24 @@ proc genVarTuple(p: BProc, n: PNode) = if forHcr or isGlobalInBlock: hcrGlobals.add((loc: v.loc, tp: if traverseProc == nil: ~"NULL" else: traverseProc)) -proc genDeref(p: BProc, e: PNode, d: var TLoc; enforceDeref=false) + if forHcr: + # end the block where the tuple gets initialized + endBlock(p) + if forHcr or isGlobalInBlock: + # insert the registration of the globals for the different parts of the tuple at the + # start of the current scope (after they have been iterated) and init a boolean to + # check if any of them is newly introduced and the initializing code has to be ran + lineCg(p, cpsLocals, "NIM_BOOL $1 = NIM_FALSE;$n", [hcrCond]) + for curr in hcrGlobals: + lineCg(p, cpsLocals, "$1 |= hcrRegisterGlobal($4, \"$2\", sizeof($3), $5, (void**)&$2);$N", + [hcrCond, curr.loc.r, rdLoc(curr.loc), getModuleDllPath(p.module, n.sons[0].sym), curr.tp]) + proc loadInto(p: BProc, le, ri: PNode, a: var TLoc) {.inline.} = if ri.kind in nkCallKinds and (ri.sons[0].kind != nkSym or ri.sons[0].sym.magic == mNone): genAsgnCall(p, le, ri, a) - elif ri.kind in {nkDerefExpr, nkHiddenDeref}: + else: # this is a hacky way to fix #1181 (tmissingderef):: # # var arr1 = cast[ptr array[4, int8]](addr foo)[] @@ -137,8 +136,7 @@ proc loadInto(p: BProc, le, ri: PNode, a: var TLoc) {.inline.} = # However, fixing this properly really requires modelling 'array' as # a 'struct' in C to preserve dereferencing semantics completely. Not # worth the effort until version 1.0 is out. - genDeref(p, ri, a, enforceDeref=true) - else: + a.flags.incl(lfEnforceDeref) expr(p, ri, a) proc assignLabel(b: var TBlock): Rope {.inline.} = @@ -203,7 +201,7 @@ proc blockLeaveActions(p: BProc, howManyTrys, howManyExcepts: int) = var stack = newSeq[tuple[n: PNode, inExcept: bool]](0) - for i in countup(1, howManyTrys): + for i in 1 .. howManyTrys: let tryStmt = p.nestedTryStmts.pop if not p.module.compileToCpp or optNoCppExceptions in p.config.globalOptions: # Pop safe points generated by try @@ -365,13 +363,11 @@ proc genSingleVar(p: BProc, a: PNode) = lineCg(targetProc, cpsStmts, "if (hcrRegisterGlobal($3, \"$1\", sizeof($2), $4, (void**)&$1))$N", [v.loc.r, rdLoc(v.loc), getModuleDllPath(p.module, v), traverseProc]) startBlock(targetProc) - defer: - if forHcr: - endBlock(targetProc) - if a.sons[2].kind != nkEmpty: genLineDir(targetProc, a) loadInto(targetProc, a.sons[0], a.sons[2], v.loc) + if forHcr: + endBlock(targetProc) proc genClosureVar(p: BProc, a: PNode) = var immediateAsgn = a.sons[2].kind != nkEmpty @@ -597,10 +593,12 @@ proc genWhileStmt(p: BProc, t: PNode) = dec(p.withinLoop) proc genBlock(p: BProc, n: PNode, d: var TLoc) = - # bug #4505: allocate the temp in the outer scope - # so that it can escape the generated {}: - if not isEmptyType(n.typ) and d.k == locNone: - getTemp(p, n.typ, d) + if not isEmptyType(n.typ): + # bug #4505: allocate the temp in the outer scope + # so that it can escape the generated {}: + if d.k == locNone: + getTemp(p, n.typ, d) + d.flags.incl(lfEnforceDeref) preserveBreakIdx: p.breakIdx = startBlock(p) if n.sons[0].kind != nkEmpty: @@ -708,7 +706,7 @@ template genCaseGenericBranch(p: BProc, b: PNode, e: TLoc, var x, y: TLoc var length = sonsLen(b) - for i in countup(0, length - 2): + for i in 0 .. length - 2: if b.sons[i].kind == nkRange: initLocExpr(p, b.sons[i].sons[0], x) initLocExpr(p, b.sons[i].sons[1], y) @@ -767,7 +765,7 @@ proc genCaseStringBranch(p: BProc, b: PNode, e: TLoc, labl: TLabel, branches: var openArray[Rope]) = var x: TLoc var length = sonsLen(b) - for i in countup(0, length - 2): + for i in 0 .. length - 2: assert(b.sons[i].kind != nkRange) initLocExpr(p, b.sons[i], x) assert(b.sons[i].kind in {nkStrLit..nkTripleStrLit}) @@ -778,7 +776,7 @@ proc genCaseStringBranch(p: BProc, b: PNode, e: TLoc, labl: TLabel, proc genStringCase(p: BProc, t: PNode, d: var TLoc) = # count how many constant strings there are in the case: var strings = 0 - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): if t.sons[i].kind == nkOfBranch: inc(strings, sonsLen(t.sons[i]) - 1) if strings > stringCaseThreshold: var bitMask = math.nextPowerOfTwo(strings) - 1 @@ -787,7 +785,7 @@ proc genStringCase(p: BProc, t: PNode, d: var TLoc) = var a: TLoc initLocExpr(p, t.sons[0], a) # fist pass: gnerate ifs+goto: var labId = p.labels - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): inc(p.labels) if t.sons[i].kind == nkOfBranch: genCaseStringBranch(p, t.sons[i], a, "LA" & rope(p.labels) & "_", @@ -798,7 +796,7 @@ proc genStringCase(p: BProc, t: PNode, d: var TLoc) = discard linefmt(p, cpsStmts, "switch (#hashString($1) & $2) {$n", [rdLoc(a), bitMask]) - for j in countup(0, high(branches)): + for j in 0 .. high(branches): if branches[j] != nil: lineF(p, cpsStmts, "case $1: $n$2break;$n", [intLiteral(j), branches[j]]) @@ -812,7 +810,7 @@ proc genStringCase(p: BProc, t: PNode, d: var TLoc) = genCaseGeneric(p, t, d, "", "if (#eqStrings($1, $2)) goto $3;$n") proc branchHasTooBigRange(b: PNode): bool = - for i in countup(0, sonsLen(b)-2): + for i in 0 .. sonsLen(b)-2: # last son is block if (b.sons[i].kind == nkRange) and b.sons[i].sons[1].intVal - b.sons[i].sons[0].intVal > RangeExpandLimit: @@ -1053,7 +1051,7 @@ proc genTry(p: BProc, t: PNode, d: var TLoc) = endBlock(p) else: var orExpr: Rope = nil - for j in countup(0, blen - 2): + for j in 0 .. blen - 2: assert(t.sons[i].sons[j].kind == nkType) if orExpr != nil: add(orExpr, "||") let checkFor = if optNimV2 in p.config.globalOptions: @@ -1232,44 +1230,18 @@ proc asgnFieldDiscriminant(p: BProc, e: PNode) = genDiscriminantCheck(p, a, tmp, dotExpr.sons[0].typ, dotExpr.sons[1].sym) genAssignment(p, a, tmp, {}) -proc patchAsgnStmtListExpr(father, orig, n: PNode) = - case n.kind - of nkDerefExpr, nkHiddenDeref: - let asgn = copyNode(orig) - asgn.add orig[0] - asgn.add n - father.add asgn - of nkStmtList, nkStmtListExpr: - for x in n: - patchAsgnStmtListExpr(father, orig, x) - else: - father.add n - proc genAsgn(p: BProc, e: PNode, fastAsgn: bool) = if e.sons[0].kind == nkSym and sfGoto in e.sons[0].sym.flags: genLineDir(p, e) genGotoVar(p, e.sons[1]) elif not fieldDiscriminantCheckNeeded(p, e): - # this fixes bug #6422 but we really need to change the representation of - # arrays in the backend... let le = e[0] let ri = e[1] - var needsRepair = false - var it = ri - while it.kind in {nkStmtList, nkStmtListExpr}: - it = it.lastSon - needsRepair = true - if it.kind in {nkDerefExpr, nkHiddenDeref} and needsRepair: - var patchedTree = newNodeI(nkStmtList, e.info) - patchAsgnStmtListExpr(patchedTree, e, ri) - genStmts(p, patchedTree) - return var a: TLoc discard getTypeDesc(p.module, le.typ.skipTypes(skipPtrs)) - if le.kind in {nkDerefExpr, nkHiddenDeref}: - genDeref(p, le, a, enforceDeref=true) - else: - initLocExpr(p, le, a) + initLoc(a, locNone, le, OnUnknown) + a.flags.incl(lfEnforceDeref) + expr(p, le, a) if fastAsgn: incl(a.flags, lfNoDeepCopy) assert(a.t != nil) genLineDir(p, ri) diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim index bcc33be14..221c7a139 100644 --- a/compiler/ccgtrav.nim +++ b/compiler/ccgtrav.nim @@ -28,7 +28,7 @@ proc genTraverseProc(c: TTraversalClosure, accessor: Rope, n: PNode; if n == nil: return case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): genTraverseProc(c, accessor, n.sons[i], typ) of nkRecCase: if (n.sons[0].kind != nkSym): internalError(c.p.config, n.info, "genTraverseProc") @@ -38,7 +38,7 @@ proc genTraverseProc(c: TTraversalClosure, accessor: Rope, n: PNode; if disc.loc.t == nil: internalError(c.p.config, n.info, "genTraverseProc()") lineF(p, cpsStmts, "switch ($1.$2) {$n", [accessor, disc.loc.r]) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): let branch = n.sons[i] assert branch.kind in {nkOfBranch, nkElse} if branch.kind == nkOfBranch: @@ -87,14 +87,14 @@ proc genTraverseProc(c: TTraversalClosure, accessor: Rope, typ: PType) = else: lineF(p, cpsStmts, "}$n", []) of tyObject: - for i in countup(0, sonsLen(typ) - 1): + for i in 0 ..< sonsLen(typ): var x = typ.sons[i] if x != nil: x = x.skipTypes(skipPtrs) genTraverseProc(c, accessor.parentObj(c.p.module), x) if typ.n != nil: genTraverseProc(c, accessor, typ.n, typ) of tyTuple: let typ = getUniqueType(typ) - for i in countup(0, sonsLen(typ) - 1): + for i in 0 ..< sonsLen(typ): genTraverseProc(c, ropecg(c.p.module, "$1.Field$2", [accessor, i]), typ.sons[i]) of tyRef: lineCg(p, cpsStmts, visitorFrmt, [accessor, c.visitorFrmt]) diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index facd8b3d4..abdb97e5d 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -407,7 +407,7 @@ proc genProcParams(m: BModule, t: PType, rettype, params: var Rope, rettype = ~"void" else: rettype = getTypeDescAux(m, t.sons[0], check) - for i in countup(1, sonsLen(t.n) - 1): + for i in 1 ..< sonsLen(t.n): if t.n.sons[i].kind != nkSym: internalError(m.config, t.n.info, "genProcParams") var param = t.n.sons[i].sym if isCompileTimeOnly(param.typ): continue @@ -468,7 +468,7 @@ proc genRecordFieldsAux(m: BModule, n: PNode, result = nil case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): add(result, genRecordFieldsAux(m, n.sons[i], rectype, check)) of nkRecCase: if n.sons[0].kind != nkSym: internalError(m.config, n.info, "genRecordFieldsAux") @@ -476,7 +476,7 @@ proc genRecordFieldsAux(m: BModule, n: PNode, # prefix mangled name with "_U" to avoid clashes with other field names, # since identifiers are not allowed to start with '_' var unionBody: Rope = nil - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: let k = lastSon(n.sons[i]) @@ -591,7 +591,7 @@ proc getTupleDesc(m: BModule, typ: PType, name: Rope, check: var IntSet): Rope = result = "$1 $2 {$n" % [structOrUnion(typ), name] var desc: Rope = nil - for i in countup(0, sonsLen(typ) - 1): + for i in 0 ..< sonsLen(typ): addf(desc, "$1 Field$2;$n", [getTypeDescAux(m, typ.sons[i], check), rope(i)]) if desc == nil: add(result, "char dummy;\L") @@ -710,7 +710,7 @@ proc getTypeDescAux(m: BModule, origTyp: PType, check: var IntSet): Rope = let owner = hashOwner(t.sym) if not gDebugInfo.hasEnum(t.sym.name.s, t.sym.info.line, owner): var vals: seq[(string, int)] = @[] - for i in countup(0, t.n.len - 1): + for i in 0 ..< t.n.len: assert(t.n.sons[i].kind == nkSym) let field = t.n.sons[i].sym vals.add((field.name.s, field.position.int)) @@ -1047,7 +1047,7 @@ proc genObjectFields(m: BModule, typ, origType: PType, n: PNode, expr: Rope; elif L > 0: var tmp = getTempName(m) & "_" & $L genTNimNodeArray(m, tmp, rope(L)) - for i in countup(0, L-1): + for i in 0 ..< L: var tmp2 = getNimNode(m) addf(m.s[cfsTypeInit3], "$1[$2] = &$3;$n", [tmp, rope(i), tmp2]) genObjectFields(m, typ, origType, n.sons[i], tmp2, info) @@ -1072,7 +1072,7 @@ proc genObjectFields(m: BModule, typ, origType: PType, n: PNode, expr: Rope; makeCString(field.name.s), tmp, rope(L)]) addf(m.s[cfsData], "TNimNode* $1[$2];$n", [tmp, rope(L+1)]) - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var b = n.sons[i] # branch var tmp2 = getNimNode(m) genObjectFields(m, typ, origType, lastSon(b), tmp2, info) @@ -1080,7 +1080,7 @@ proc genObjectFields(m: BModule, typ, origType: PType, n: PNode, expr: Rope; of nkOfBranch: if sonsLen(b) < 2: internalError(m.config, b.info, "genObjectFields; nkOfBranch broken") - for j in countup(0, sonsLen(b) - 2): + for j in 0 .. sonsLen(b) - 2: if b.sons[j].kind == nkRange: var x = int(getOrdValue(b.sons[j].sons[0])) var y = int(getOrdValue(b.sons[j].sons[1])) @@ -1133,7 +1133,7 @@ proc genTupleInfo(m: BModule, typ, origType: PType, name: Rope; info: TLineInfo) if length > 0: var tmp = getTempName(m) & "_" & $length genTNimNodeArray(m, tmp, rope(length)) - for i in countup(0, length - 1): + for i in 0 ..< length: var a = typ.sons[i] var tmp2 = getNimNode(m) addf(m.s[cfsTypeInit3], "$1[$2] = &$3;$n", [tmp, rope(i), tmp2]) @@ -1161,7 +1161,7 @@ proc genEnumInfo(m: BModule, typ: PType, name: Rope; info: TLineInfo) = var enumNames, specialCases: Rope var firstNimNode = m.typeNodes var hasHoles = false - for i in countup(0, length - 1): + for i in 0 ..< length: assert(typ.n.sons[i].kind == nkSym) var field = typ.n.sons[i].sym var elemNode = getNimNode(m) diff --git a/compiler/ccgutils.nim b/compiler/ccgutils.nim index 6d2f33f2d..c608a8cb0 100644 --- a/compiler/ccgutils.nim +++ b/compiler/ccgutils.nim @@ -33,7 +33,7 @@ proc hashString*(conf: ConfigRef; s: string): BiggestInt = # we have to use the same bitwidth # as the target CPU var b = 0'i64 - for i in countup(0, len(s) - 1): + for i in 0 ..< len(s): b = b +% ord(s[i]) b = b +% `shl`(b, 10) b = b xor `shr`(b, 6) @@ -43,7 +43,7 @@ proc hashString*(conf: ConfigRef; s: string): BiggestInt = result = b else: var a = 0'i32 - for i in countup(0, len(s) - 1): + for i in 0 ..< len(s): a = a +% ord(s[i]).int32 a = a +% `shl`(a, 10'i32) a = a xor `shr`(a, 6'i32) diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 9bc3353dc..c46c846d2 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -202,7 +202,7 @@ macro ropecg(m: BModule, frmt: static[FormatStr], args: untyped): Rope = proc indentLine(p: BProc, r: Rope): Rope = result = r - for i in countup(0, p.blocks.len-1): + for i in 0 ..< p.blocks.len: prepend(result, "\t".rope) template appcg(m: BModule, c: var Rope, frmt: FormatStr, @@ -664,7 +664,7 @@ proc loadDynamicLib(m: BModule, lib: PLib) = libCandidates(lib.path.strVal, s) rawMessage(m.config, hintDependency, lib.path.strVal) var loadlib: Rope = nil - for i in countup(0, high(s)): + for i in 0 .. high(s): inc(m.labels) if i > 0: add(loadlib, "||") let n = newStrNode(nkStrLit, s[i]) @@ -1004,7 +1004,7 @@ proc genProcAux(m: BModule, prc: PSym) = #incl(res.loc.flags, lfIndirect) res.loc.storage = OnUnknown - for i in countup(1, sonsLen(prc.typ.n) - 1): + for i in 1 ..< sonsLen(prc.typ.n): let param = prc.typ.n.sons[i].sym if param.typ.isCompileTimeOnly: continue assignParam(p, param, prc.typ[0]) @@ -1710,7 +1710,7 @@ proc genModule(m: BModule, cfile: Cfile): Rope = add(result, "#define nimfr_(x, y)\n#define nimln_(x, y)\n") add(result, genSectionEnd(cfsFrameDefines, m.config)) - for i in countup(cfsForwardTypes, cfsProcs): + for i in cfsForwardTypes .. cfsProcs: if m.s[i].len > 0: moduleIsEmpty = false add(result, genSectionStart(i, m.config)) @@ -1811,7 +1811,7 @@ proc writeHeader(m: BModule) = generateHeaders(m) generateThreadLocalStorage(m) - for i in countup(cfsHeaders, cfsProcs): + for i in cfsHeaders .. cfsProcs: add(result, genSectionStart(i, m.config)) add(result, m.s[i]) add(result, genSectionEnd(i, m.config)) diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim index c97b1b1aa..d9e99a84a 100644 --- a/compiler/cgmeth.nim +++ b/compiler/cgmeth.nim @@ -48,7 +48,7 @@ proc methodCall*(n: PNode; conf: ConfigRef): PNode = if disp != nil: result.sons[0].sym = disp # change the arguments to up/downcasts to fit the dispatcher's parameters: - for i in countup(1, sonsLen(result)-1): + for i in 1 ..< sonsLen(result): result.sons[i] = genConv(result.sons[i], disp.typ.sons[i], true, conf) else: localError(conf, n.info, "'" & $result.sons[0] & "' lacks a dispatcher") @@ -61,7 +61,7 @@ proc sameMethodBucket(a, b: PSym): MethodResult = if sonsLen(a.typ) != sonsLen(b.typ): return - for i in countup(1, sonsLen(a.typ) - 1): + for i in 1 ..< sonsLen(a.typ): var aa = a.typ.sons[i] var bb = b.typ.sons[i] while true: @@ -160,7 +160,7 @@ proc fixupDispatcher(meth, disp: PSym; conf: ConfigRef) = proc methodDef*(g: ModuleGraph; s: PSym, fromCache: bool) = let L = len(g.methods) var witness: PSym - for i in countup(0, L - 1): + for i in 0 ..< L: let disp = g.methods[i].dispatcher case sameMethodBucket(disp, s) of Yes: @@ -192,13 +192,13 @@ proc relevantCol(methods: seq[PSym], col: int): bool = # returns true iff the position is relevant var t = methods[0].typ.sons[col].skipTypes(skipPtrs) if t.kind == tyObject: - for i in countup(1, high(methods)): + for i in 1 .. high(methods): let t2 = skipTypes(methods[i].typ.sons[col], skipPtrs) if not sameType(t2, t): return true proc cmpSignatures(a, b: PSym, relevantCols: IntSet): int = - for col in countup(1, sonsLen(a.typ) - 1): + for col in 1 ..< sonsLen(a.typ): if contains(relevantCols, col): var aa = skipTypes(a.typ.sons[col], skipPtrs) var bb = skipTypes(b.typ.sons[col], skipPtrs) @@ -215,7 +215,7 @@ proc sortBucket(a: var seq[PSym], relevantCols: IntSet) = if h > n: break while true: h = h div 3 - for i in countup(h, n - 1): + for i in h ..< n: var v = a[i] var j = i while cmpSignatures(a[j - h], v, relevantCols) >= 0: @@ -234,16 +234,16 @@ proc genDispatcher(g: ModuleGraph; methods: seq[PSym], relevantCols: IntSet): PS var ands = getSysMagic(g, unknownLineInfo(), "and", mAnd) var iss = getSysMagic(g, unknownLineInfo(), "of", mOf) let boolType = getSysType(g, unknownLineInfo(), tyBool) - for col in countup(1, paramLen - 1): + for col in 1 ..< paramLen: if contains(relevantCols, col): let param = base.typ.n.sons[col].sym if param.typ.skipTypes(abstractInst).kind in {tyRef, tyPtr}: addSon(nilchecks, newTree(nkCall, newSymNode(getCompilerProc(g, "chckNilDisp")), newSymNode(param))) - for meth in countup(0, high(methods)): + for meth in 0 .. high(methods): var curr = methods[meth] # generate condition: var cond: PNode = nil - for col in countup(1, paramLen - 1): + for col in 1 ..< paramLen: if contains(relevantCols, col): var isn = newNodeIT(nkCall, base.info, boolType) addSon(isn, newSymNode(iss)) @@ -261,7 +261,7 @@ proc genDispatcher(g: ModuleGraph; methods: seq[PSym], relevantCols: IntSet): PS let retTyp = base.typ.sons[0] let call = newNodeIT(nkCall, base.info, retTyp) addSon(call, newSymNode(curr)) - for col in countup(1, paramLen - 1): + for col in 1 ..< paramLen: addSon(call, genConv(newSymNode(base.typ.n.sons[col].sym), curr.typ.sons[col], false, g.config)) var ret: PNode @@ -286,9 +286,9 @@ proc genDispatcher(g: ModuleGraph; methods: seq[PSym], relevantCols: IntSet): PS proc generateMethodDispatchers*(g: ModuleGraph): PNode = result = newNode(nkStmtList) - for bucket in countup(0, len(g.methods) - 1): + for bucket in 0 ..< len(g.methods): var relevantCols = initIntSet() - for col in countup(1, sonsLen(g.methods[bucket].methods[0].typ) - 1): + for col in 1 ..< sonsLen(g.methods[bucket].methods[0].typ): if relevantCol(g.methods[bucket].methods, col): incl(relevantCols, col) if optMultiMethods notin g.config.globalOptions: # if multi-methods are not enabled, we are interested only in the first field diff --git a/compiler/depends.nim b/compiler/depends.nim index d380d637a..300ab3b54 100644 --- a/compiler/depends.nim +++ b/compiler/depends.nim @@ -35,14 +35,14 @@ proc addDotDependency(c: PPassContext, n: PNode): PNode = let b = Backend(g.graph.backend) case n.kind of nkImportStmt: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var imported = getModuleName(g.config, n.sons[i]) addDependencyAux(b, g.module.name.s, imported) of nkFromStmt, nkImportExceptStmt: var imported = getModuleName(g.config, n.sons[0]) addDependencyAux(b, g.module.name.s, imported) of nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: - for i in countup(0, sonsLen(n) - 1): discard addDotDependency(c, n.sons[i]) + for i in 0 ..< sonsLen(n): discard addDotDependency(c, n.sons[i]) else: discard diff --git a/compiler/dfa.nim b/compiler/dfa.nim index d36427098..513fd0a16 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -441,7 +441,7 @@ proc genIf(c: var Con, n: PNode) = ]# let oldLen = c.forks.len var endings: seq[TPosition] = @[] - for i in countup(0, len(n) - 1): + for i in 0 ..< len(n): var it = n.sons[i] c.gen(it.sons[0]) if it.len == 2: diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 014f757db..2e9b1affe 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -177,7 +177,7 @@ template dispA(conf: ConfigRef; dest: var Rope, xml, tex: string, args: openArra else: addf(dest, tex, args) proc getVarIdx(varnames: openArray[string], id: string): int = - for i in countup(0, high(varnames)): + for i in 0 .. high(varnames): if cmpIgnoreStyle(varnames[i], id) == 0: return i result = -1 @@ -254,9 +254,9 @@ proc genRecCommentAux(d: PDoc, n: PNode): Rope = result = genComment(d, n).rope if result == nil: if n.kind in {nkStmtList, nkStmtListExpr, nkTypeDef, nkConstDef, - nkObjectTy, nkRefTy, nkPtrTy, nkAsgn, nkFastAsgn}: + nkObjectTy, nkRefTy, nkPtrTy, nkAsgn, nkFastAsgn, nkHiddenStdConv}: # notin {nkEmpty..nkNilLit, nkEnumTy, nkTupleTy}: - for i in countup(0, len(n)-1): + for i in 0 ..< len(n): result = genRecCommentAux(d, n.sons[i]) if result != nil: return else: @@ -284,7 +284,7 @@ proc getPlainDocstring(n: PNode): string = if startsWith(n.comment, "##"): result = n.comment if result.len < 1: - for i in countup(0, safeLen(n)-1): + for i in 0 ..< safeLen(n): result = getPlainDocstring(n.sons[i]) if result.len > 0: return @@ -838,13 +838,13 @@ proc generateDoc*(d: PDoc, n, orig: PNode) = when useEffectSystem: documentRaises(d.cache, n) genItem(d, n, n.sons[namePos], skConverter) of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.sons[i].kind != nkCommentStmt: # order is always 'type var let const': genItem(d, n.sons[i], n.sons[i].sons[0], succ(skType, ord(n.kind)-ord(nkTypeSection))) of nkStmtList: - for i in countup(0, sonsLen(n) - 1): generateDoc(d, n.sons[i], orig) + for i in 0 ..< sonsLen(n): generateDoc(d, n.sons[i], orig) of nkWhenStmt: # generate documentation for the first branch only: if not checkForFalse(n.sons[0].sons[0]): @@ -892,13 +892,13 @@ proc generateJson*(d: PDoc, n: PNode, includeComments: bool = true) = when useEffectSystem: documentRaises(d.cache, n) d.add genJsonItem(d, n, n.sons[namePos], skConverter) of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.sons[i].kind != nkCommentStmt: # order is always 'type var let const': d.add genJsonItem(d, n.sons[i], n.sons[i].sons[0], succ(skType, ord(n.kind)-ord(nkTypeSection))) of nkStmtList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): generateJson(d, n.sons[i], includeComments) of nkWhenStmt: # generate documentation for the first branch only: @@ -935,13 +935,13 @@ proc generateTags*(d: PDoc, n: PNode, r: var Rope) = when useEffectSystem: documentRaises(d.cache, n) r.add genTagsItem(d, n, n.sons[namePos], skConverter) of nkTypeSection, nkVarSection, nkLetSection, nkConstSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.sons[i].kind != nkCommentStmt: # order is always 'type var let const': r.add genTagsItem(d, n.sons[i], n.sons[i].sons[0], succ(skType, ord(n.kind)-ord(nkTypeSection))) of nkStmtList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): generateTags(d, n.sons[i], r) of nkWhenStmt: # generate documentation for the first branch only: @@ -971,12 +971,12 @@ proc genOutFile(d: PDoc): Rope = var tmp = "" renderTocEntries(d[], j, 1, tmp) var toc = tmp.rope - for i in countup(low(TSymKind), high(TSymKind)): + for i in low(TSymKind) .. high(TSymKind): genSection(d, i) add(toc, d.toc[i]) if toc != nil: toc = ropeFormatNamedVars(d.conf, getConfigVar(d.conf, "doc.toc"), ["content"], [toc]) - for i in countup(low(TSymKind), high(TSymKind)): add(code, d.section[i]) + for i in low(TSymKind) .. high(TSymKind): add(code, d.section[i]) # Extract the title. Non API modules generate an entry in the index table. if d.meta[metaTitle].len != 0: diff --git a/compiler/evalffi.nim b/compiler/evalffi.nim index ab5745787..9b2a4f93c 100644 --- a/compiler/evalffi.nim +++ b/compiler/evalffi.nim @@ -138,13 +138,13 @@ proc pack(conf: ConfigRef, v: PNode, typ: PType, res: pointer) proc getField(conf: ConfigRef, n: PNode; position: int): PSym = case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = getField(conf, n.sons[i], position) if result != nil: return of nkRecCase: result = getField(conf, n.sons[0], position) if result != nil: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = getField(conf, lastSon(n.sons[i]), position) @@ -158,7 +158,7 @@ proc packObject(conf: ConfigRef, x: PNode, typ: PType, res: pointer) = internalAssert conf, x.kind in {nkObjConstr, nkPar, nkTupleConstr} # compute the field's offsets: discard getSize(conf, typ) - for i in countup(ord(x.kind == nkObjConstr), sonsLen(x) - 1): + for i in ord(x.kind == nkObjConstr) ..< sonsLen(x): var it = x.sons[i] if it.kind == nkExprColonExpr: internalAssert conf, it.sons[0].kind == nkSym @@ -245,7 +245,7 @@ proc unpack(conf: ConfigRef, x: pointer, typ: PType, n: PNode): PNode proc unpackObjectAdd(conf: ConfigRef, x: pointer, n, result: PNode) = case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): unpackObjectAdd(conf, x, n.sons[i], result) of nkRecCase: globalError(conf, result.info, "case objects cannot be unpacked") @@ -275,7 +275,7 @@ proc unpackObject(conf: ConfigRef, x: pointer, typ: PType, n: PNode): PNode = globalError(conf, n.info, "cannot map value from FFI") if typ.n.isNil: globalError(conf, n.info, "cannot unpack unnamed tuple") - for i in countup(ord(n.kind == nkObjConstr), sonsLen(n) - 1): + for i in ord(n.kind == nkObjConstr) ..< sonsLen(n): var it = n.sons[i] if it.kind == nkExprColonExpr: internalAssert conf, it.sons[0].kind == nkSym diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim index 14388367a..a7d319360 100644 --- a/compiler/evaltempl.nim +++ b/compiler/evaltempl.nim @@ -37,7 +37,7 @@ proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = case templ.kind of nkSym: var s = templ.sym - if s.owner == nil or s.owner.id == c.owner.id: + if (s.owner == nil and s.kind == skParam) or s.owner == c.owner: if s.kind == skParam and sfGenSym notin s.flags: handleParam actual.sons[s.position] elif (s.owner != nil) and (s.kind == skGenericParam or @@ -64,7 +64,7 @@ proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = # "declarative" context (bug #9235). if c.isDeclarative: var res = copyNode(c, templ, actual) - for i in countup(0, sonsLen(templ) - 1): + for i in 0 ..< sonsLen(templ): evalTemplateAux(templ.sons[i], actual, c, res) result.add res else: @@ -78,7 +78,7 @@ proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = c.isDeclarative = true isDeclarative = true var res = copyNode(c, templ, actual) - for i in countup(0, sonsLen(templ) - 1): + for i in 0 ..< sonsLen(templ): evalTemplateAux(templ.sons[i], actual, c, res) result.add res if isDeclarative: c.isDeclarative = false @@ -189,7 +189,7 @@ proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; ctx.instLines = sfCallsite in tmpl.flags if ctx.instLines: result.info = n.info - for i in countup(0, safeLen(body) - 1): + for i in 0 ..< safeLen(body): evalTemplateAux(body.sons[i], args, ctx, result) result.flags.incl nfFromTemplate result = wrapInComesFrom(n.info, tmpl, result) diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index 9880ecf4f..499cca6d8 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -370,7 +370,7 @@ proc libNameTmpl(conf: ConfigRef): string {.inline.} = proc nameToCC*(name: string): TSystemCC = ## Returns the kind of compiler referred to by `name`, or ccNone ## if the name doesn't refer to any known compiler. - for i in countup(succ(ccNone), high(TSystemCC)): + for i in succ(ccNone) .. high(TSystemCC): if cmpIgnoreStyle(name, CC[i].name) == 0: return i result = ccNone @@ -412,7 +412,7 @@ proc setCC*(conf: ConfigRef; ccname: string; info: TLineInfo) = conf.compileOptions = getConfigVar(conf, conf.cCompiler, ".options.always") conf.linkOptions = "" conf.ccompilerpath = getConfigVar(conf, conf.cCompiler, ".path") - for i in countup(low(CC), high(CC)): undefSymbol(conf.symbols, CC[i].name) + for i in low(CC) .. high(CC): undefSymbol(conf.symbols, CC[i].name) defineSymbol(conf.symbols, CC[conf.cCompiler].name) proc addOpt(dest: var string, src: string) = @@ -434,7 +434,7 @@ proc addCompileOptionCmd*(conf: ConfigRef; option: string) = proc initVars*(conf: ConfigRef) = # we need to define the symbol here, because ``CC`` may have never been set! - for i in countup(low(CC), high(CC)): undefSymbol(conf.symbols, CC[i].name) + for i in low(CC) .. high(CC): undefSymbol(conf.symbols, CC[i].name) defineSymbol(conf.symbols, CC[conf.cCompiler].name) addCompileOption(conf, getConfigVar(conf, conf.cCompiler, ".options.always")) #addLinkOption(getConfigVar(cCompiler, ".options.linker")) @@ -663,7 +663,7 @@ proc compileCFiles(conf: ConfigRef; list: CFileList, script: var Rope, cmds: var if optCompileOnly notin conf.globalOptions: add(cmds, compileCmd) let (_, name, _) = splitFile(it.cname) - add(prettyCmds, if hintCC in conf.notes: "CC: " & name else: "") + add(prettyCmds, if hintCC in conf.notes: "CC: " & demaglePackageName(name) else: "") if optGenScript in conf.globalOptions: add(script, compileCmd) add(script, "\n") @@ -787,7 +787,7 @@ proc execCmdsInParallel(conf: ConfigRef; cmds: seq[string]; prettyCb: proc (idx: if conf.numberOfProcessors == 0: conf.numberOfProcessors = countProcessors() var res = 0 if conf.numberOfProcessors <= 1: - for i in countup(0, high(cmds)): + for i in 0 .. high(cmds): tryExceptOSErrorMessage(conf, "invocation of external compiler program failed."): res = execWithEcho(conf, cmds[i]) if res != 0: diff --git a/compiler/filters.nim b/compiler/filters.nim index d9e8e41da..c04d61320 100644 --- a/compiler/filters.nim +++ b/compiler/filters.nim @@ -20,7 +20,7 @@ proc invalidPragma(conf: ConfigRef; n: PNode) = proc getArg(conf: ConfigRef; n: PNode, name: string, pos: int): PNode = result = nil if n.kind in {nkEmpty..nkNilLit}: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if n.sons[i].kind == nkExprEqExpr: if n.sons[i].sons[0].kind != nkIdent: invalidPragma(conf, n) if cmpIgnoreStyle(n.sons[i].sons[0].ident.s, name) == 0: diff --git a/compiler/guards.nim b/compiler/guards.nim index 46e18d3bf..bfa295fd2 100644 --- a/compiler/guards.nim +++ b/compiler/guards.nim @@ -443,7 +443,7 @@ proc sameTree*(a, b: PNode): bool = of nkEmpty, nkNilLit: result = true else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameTree(a.sons[i], b.sons[i]): return result = true diff --git a/compiler/idents.nim b/compiler/idents.nim index 58800b73d..f82ff5db5 100644 --- a/compiler/idents.nim +++ b/compiler/idents.nim @@ -87,7 +87,7 @@ proc getIdent*(ic: IdentCache; identifier: cstring, length: int, h: Hash): PIden new(result) result.h = h result.s = newString(length) - for i in countup(0, length - 1): result.s[i] = identifier[i] + for i in 0 ..< length: result.s[i] = identifier[i] result.next = ic.buckets[idx] ic.buckets[idx] = result if id == 0: @@ -110,7 +110,7 @@ proc newIdentCache*(): IdentCache = result.idDelegator = result.getIdent":delegator" result.emptyIdent = result.getIdent("") # initialize the keywords: - for s in countup(succ(low(specialWords)), high(specialWords)): + for s in succ(low(specialWords)) .. high(specialWords): result.getIdent(specialWords[s], hashIgnoreStyle(specialWords[s])).id = ord(s) proc whichKeyword*(id: PIdent): TSpecialWord = diff --git a/compiler/importer.nim b/compiler/importer.nim index eef0c9bb9..a43818d93 100644 --- a/compiler/importer.nim +++ b/compiler/importer.nim @@ -47,7 +47,7 @@ proc rawImportSymbol(c: PContext, s: PSym) = if s.kind == skType: var etyp = s.typ if etyp.kind in {tyBool, tyEnum}: - for j in countup(0, sonsLen(etyp.n) - 1): + for j in 0 ..< sonsLen(etyp.n): var e = etyp.n.sons[j].sym if e.kind != skEnumField: internalError(c.config, s.info, "rawImportSymbol") @@ -92,7 +92,7 @@ proc importSymbol(c: PContext, n: PNode, fromMod: PSym) = rawImportSymbol(c, e) e = nextIdentIter(it, fromMod.tab) else: rawImportSymbol(c, s) - suggestSym(c.config, n.info, s, c.graph.usageSym, false) + suggestSym(c.config, n.info, s, c.graph.usageSym, false) proc importAllSymbolsExcept(c: PContext, fromMod: PSym, exceptSet: IntSet) = var i: TTabIter @@ -146,7 +146,7 @@ proc myImportModule(c: PContext, n: PNode; importStmtResult: PNode): PSym = #echo "adding ", toFullPath(f), " at ", L+1 if recursion >= 0: var err = "" - for i in countup(recursion, L-1): + for i in recursion ..< L: if i > recursion: err.add "\n" err.add toFullPath(c.config, c.graph.importStack[i]) & " imports " & toFullPath(c.config, c.graph.importStack[i+1]) @@ -189,7 +189,7 @@ proc impMod(c: PContext; it: PNode; importStmtResult: PNode) = proc evalImport*(c: PContext, n: PNode): PNode = result = newNodeI(nkImportStmt, n.info) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n.sons[i] if it.kind == nkInfix and it.len == 3 and it[2].kind == nkBracket: let sep = it[0] @@ -219,7 +219,7 @@ proc evalFrom*(c: PContext, n: PNode): PNode = if m != nil: n.sons[0] = newSymNode(m) addDecl(c, m, n.info) # add symbol to symbol table of module - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if n.sons[i].kind != nkNilLit: importSymbol(c, n.sons[i], m) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index 90ea0356b..0111bd4af 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -325,7 +325,7 @@ proc genOp(c: Con; t: PType; kind: TTypeAttachedOp; dest, ri: PNode): PNode = if op == nil: # give up and find the canonical type instead: - let h = sighashes.hashType(t, {CoType, CoConsiderOwned}) + let h = sighashes.hashType(t, {CoType, CoConsiderOwned, CoDistinct}) let canon = c.graph.canonTypes.getOrDefault(h) if canon != nil: op = canon.attachedOps[kind] @@ -426,11 +426,13 @@ proc sinkParamIsLastReadCheck(c: var Con, s: PNode) = proc isSinkTypeForParam(t: PType): bool = # a parameter like 'seq[owned T]' must not be used only once, but its # elements must, so we detect this case here: - if isSinkType(t): - if t.skipTypes({tyGenericInst, tyAlias}).kind in {tyArray, tyVarargs, tyOpenArray, tySequence}: - result = false - else: - result = true + result = t.skipTypes({tyGenericInst, tyAlias}).kind in {tySink, tyOwned} + when false: + if isSinkType(t): + if t.skipTypes({tyGenericInst, tyAlias}).kind in {tyArray, tyVarargs, tyOpenArray, tySequence}: + result = false + else: + result = true proc passCopyToSink(n: PNode; c: var Con): PNode = result = newNodeIT(nkStmtListExpr, n.info, n.typ) @@ -817,7 +819,7 @@ proc injectDestructorCalls*(g: ModuleGraph; owner: PSym; n: PNode): PNode = let params = owner.typ.n for i in 1 ..< params.len: let param = params[i].sym - if isSinkParam(param) and hasDestructor(param.typ.skipTypes({tySink})): + if isSinkTypeForParam(param.typ) and hasDestructor(param.typ.skipTypes({tySink})): c.addDestroy genDestroy(c, param.typ.skipTypes({tyGenericInst, tyAlias, tySink}), params[i]) #if optNimV2 in c.graph.config.globalOptions: diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim index cd13aab78..193077760 100644 --- a/compiler/jsgen.nim +++ b/compiler/jsgen.nim @@ -109,7 +109,7 @@ proc indentLine(p: PProc, r: Rope): Rope = result = r var p = p while true: - for i in countup(0, p.blocks.len - 1 + p.extraIndent): + for i in 0 ..< p.blocks.len + p.extraIndent: prepend(result, "\t".rope) if p.up == nil or p.up.prc != p.prc.owner: break @@ -780,7 +780,7 @@ proc genTry(p: PProc, n: PNode, r: var TCompRes) = var excAlias: PNode = nil useMagic(p, "isObj") - for j in countup(0, blen - 2): + for j in 0 .. blen - 2: var throwObj: PNode let it = n.sons[i].sons[j] @@ -858,11 +858,11 @@ proc genCaseJS(p: PProc, n: PNode, r: var TCompRes) = if not isEmptyType(n.typ): r.kind = resVal r.res = getTemp(p) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): let it = n.sons[i] case it.kind of nkOfBranch: - for j in countup(0, sonsLen(it) - 2): + for j in 0 .. sonsLen(it) - 2: let e = it.sons[j] if e.kind == nkRange: var v = copyNode(e.sons[0]) @@ -930,7 +930,7 @@ proc genBreakStmt(p: PProc, n: PNode) = proc genAsmOrEmitStmt(p: PProc, n: PNode) = genLineDir(p, n) p.body.add p.indentLine(nil) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n[i] case it.kind of nkStrLit..nkTripleStrLit: @@ -968,7 +968,7 @@ proc genIf(p: PProc, n: PNode, r: var TCompRes) = if not isEmptyType(n.typ): r.kind = resVal r.res = getTemp(p) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n.sons[i] if sonsLen(it) != 1: if i > 0: @@ -987,7 +987,7 @@ proc genIf(p: PProc, n: PNode, r: var TCompRes) = proc generateHeader(p: PProc, typ: PType): Rope = result = nil - for i in countup(1, sonsLen(typ.n) - 1): + for i in 1 ..< sonsLen(typ.n): assert(typ.n.sons[i].kind == nkSym) var param = typ.n.sons[i].sym if isCompileTimeOnly(param.typ): continue @@ -1000,7 +1000,7 @@ proc generateHeader(p: PProc, typ: PType): Rope = add(result, "_Idx") proc countJsParams(typ: PType): int = - for i in countup(1, sonsLen(typ.n) - 1): + for i in 1 ..< sonsLen(typ.n): assert(typ.n.sons[i].kind == nkSym) var param = typ.n.sons[i].sym if isCompileTimeOnly(param.typ): continue @@ -1443,7 +1443,7 @@ proc genArgs(p: PProc, n: PNode, r: var TCompRes; start=1) = assert(sonsLen(typ) == sonsLen(typ.n)) var emitted = start-1 - for i in countup(start, sonsLen(n) - 1): + for i in start ..< sonsLen(n): let it = n.sons[i] var paramType: PNode = nil if i < sonsLen(typ): @@ -1562,7 +1562,7 @@ proc genEcho(p: PProc, n: PNode, r: var TCompRes) = useMagic(p, "toJSStr") # Used in rawEcho useMagic(p, "rawEcho") add(r.res, "rawEcho(") - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n.sons[i] if it.typ.isCompileTimeOnly: continue if i > 0: add(r.res, ", ") @@ -1578,11 +1578,11 @@ proc createVar(p: PProc, typ: PType, indirect: bool): Rope proc createRecordVarAux(p: PProc, rec: PNode, excludedFieldIDs: IntSet, output: var Rope) = case rec.kind of nkRecList: - for i in countup(0, sonsLen(rec) - 1): + for i in 0 ..< sonsLen(rec): createRecordVarAux(p, rec.sons[i], excludedFieldIDs, output) of nkRecCase: createRecordVarAux(p, rec.sons[0], excludedFieldIDs, output) - for i in countup(1, sonsLen(rec) - 1): + for i in 1 ..< sonsLen(rec): createRecordVarAux(p, lastSon(rec.sons[i]), excludedFieldIDs, output) of nkSym: # Do not produce code for void types @@ -1753,7 +1753,7 @@ proc genVarInit(p: PProc, v: PSym, n: PNode) = lineF(p, "}$n") proc genVarStmt(p: PProc, n: PNode) = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind != nkCommentStmt: if a.kind == nkVarTuple: @@ -1811,7 +1811,7 @@ proc genConStrStr(p: PProc, n: PNode, r: var TCompRes) = else: r.res.add("($1 || []).concat(" % [a.res]) - for i in countup(2, sonsLen(n) - 2): + for i in 2 .. sonsLen(n) - 2: gen(p, n.sons[i], a) if skipTypes(n.sons[i].typ, abstractVarRange).kind == tyChar: r.res.add("[$1]," % [a.res]) @@ -1831,7 +1831,7 @@ proc genToArray(p: PProc; n: PNode; r: var TCompRes) = r.res = rope("array(") let x = skipConv(n[1]) if x.kind == nkBracket: - for i in countup(0, x.len - 1): + for i in 0 ..< x.len: let it = x[i] if it.kind in {nkPar, nkTupleConstr} and it.len == 2: if i > 0: r.res.add(", ") @@ -2070,7 +2070,7 @@ proc genSetConstr(p: PProc, n: PNode, r: var TCompRes) = useMagic(p, "setConstr") r.res = rope("setConstr(") r.kind = resExpr - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: add(r.res, ", ") var it = n.sons[i] if it.kind == nkRange: @@ -2092,7 +2092,7 @@ proc genArrayConstr(p: PProc, n: PNode, r: var TCompRes) = var a: TCompRes r.res = rope("[") r.kind = resExpr - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: add(r.res, ", ") gen(p, n.sons[i], a) if a.typ == etyBaseIndex: @@ -2109,7 +2109,7 @@ proc genTupleConstr(p: PProc, n: PNode, r: var TCompRes) = var a: TCompRes r.res = rope("{") r.kind = resExpr - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: add(r.res, ", ") var it = n.sons[i] if it.kind == nkExprColonExpr: it = it.sons[1] @@ -2129,7 +2129,7 @@ proc genObjConstr(p: PProc, n: PNode, r: var TCompRes) = r.kind = resExpr var initList : Rope var fieldIDs = initIntSet() - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if i > 1: add(initList, ", ") var it = n.sons[i] internalAssert p.config, it.kind == nkExprColonExpr @@ -2463,7 +2463,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) = # this shows the distinction is nice for backends and should be kept # in the frontend let isExpr = not isEmptyType(n.typ) - for i in countup(0, sonsLen(n) - 1 - isExpr.ord): + for i in 0 ..< sonsLen(n) - isExpr.ord: genStmt(p, n.sons[i]) if isExpr: gen(p, lastSon(n), r) diff --git a/compiler/jstypes.nim b/compiler/jstypes.nim index 743158505..b49985cbf 100644 --- a/compiler/jstypes.nim +++ b/compiler/jstypes.nim @@ -24,7 +24,7 @@ proc genObjectFields(p: PProc, typ: PType, n: PNode): Rope = result = genObjectFields(p, typ, n.sons[0]) else: s = nil - for i in countup(0, length - 1): + for i in 0 ..< length: if i > 0: add(s, ", \L") add(s, genObjectFields(p, typ, n.sons[i])) result = ("{kind: 2, len: $1, offset: 0, " & @@ -41,14 +41,14 @@ proc genObjectFields(p: PProc, typ: PType, n: PNode): Rope = if (n.sons[0].kind != nkSym): internalError(p.config, n.info, "genObjectFields") field = n.sons[0].sym s = genTypeInfo(p, field.typ) - for i in countup(1, length - 1): + for i in 1 ..< length: b = n.sons[i] # branch u = nil case b.kind of nkOfBranch: if sonsLen(b) < 2: internalError(p.config, b.info, "genObjectFields; nkOfBranch broken") - for j in countup(0, sonsLen(b) - 2): + for j in 0 .. sonsLen(b) - 2: if u != nil: add(u, ", ") if b.sons[j].kind == nkRange: addf(u, "[$1, $2]", [rope(getOrdValue(b.sons[j].sons[0])), @@ -103,7 +103,7 @@ proc genTupleInfo(p: PProc, typ: PType, name: Rope) = proc genEnumInfo(p: PProc, typ: PType, name: Rope) = let length = sonsLen(typ.n) var s: Rope = nil - for i in countup(0, length - 1): + for i in 0 ..< length: if (typ.n.sons[i].kind != nkSym): internalError(p.config, typ.n.info, "genEnumInfo") let field = typ.n.sons[i].sym if i > 0: add(s, ", \L") diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim index 2dcaa7984..3e3b74f64 100644 --- a/compiler/liftdestructors.nim +++ b/compiler/liftdestructors.nim @@ -593,12 +593,13 @@ proc createTypeBoundOps(c: PContext; orig: PType; info: TLineInfo) = if orig == nil or {tfCheckedForDestructor, tfHasMeta} * orig.skipTypes({tyAlias}).flags != {}: return incl orig.flags, tfCheckedForDestructor - let h = sighashes.hashType(orig, {CoType, CoConsiderOwned}) + let h = sighashes.hashType(orig, {CoType, CoConsiderOwned, CoDistinct}) var canon = c.graph.canonTypes.getOrDefault(h) var overwrite = false if canon == nil: - c.graph.canonTypes[h] = orig - canon = orig + let typ = orig.skipTypes({tyGenericInst, tyAlias}) + c.graph.canonTypes[h] = typ + canon = typ elif canon != orig: overwrite = true @@ -608,17 +609,17 @@ proc createTypeBoundOps(c: PContext; orig: PType; info: TLineInfo) = # 3. we have a lifted destructor. # 4. We have a custom destructor. # 5. We have a (custom) generic destructor. - let typ = canon.skipTypes({tyGenericInst, tyAlias}) + # we generate the destructor first so that other operators can depend on it: for k in attachedDestructor..attachedSink: - if typ.attachedOps[k] == nil: - discard produceSym(c, typ, k, info) + if canon.attachedOps[k] == nil: + discard produceSym(c, canon, k, info) else: - inst(typ.attachedOps[k], typ) + inst(canon.attachedOps[k], canon) if overwrite: for k in attachedDestructor..attachedSink: - orig.attachedOps[k] = typ.attachedOps[k] + orig.attachedOps[k] = canon.attachedOps[k] if not isTrival(orig.destructor): #or not isTrival(orig.assignment) or diff --git a/compiler/lookups.nim b/compiler/lookups.nim index 8bc263485..a8908b1f6 100644 --- a/compiler/lookups.nim +++ b/compiler/lookups.nim @@ -255,7 +255,7 @@ proc errorUseQualifier*(c: PContext; info: TLineInfo; s: PSym) = var candidate = initIdentIter(ti, c.importTable.symbols, s.name) var i = 0 while candidate != nil: - if i == 0: err.add " --use " + if i == 0: err.add " -- use " else: err.add " or " err.add candidate.owner.name.s & "." & candidate.name.s candidate = nextIdentIter(ti, c.importTable.symbols) diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index 5004ba90b..0b2d56a54 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -179,14 +179,14 @@ proc lookupInRecord(n: PNode, id: int): PSym = result = nil case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = lookupInRecord(n.sons[i], id) if result != nil: return of nkRecCase: if n.sons[0].kind != nkSym: return result = lookupInRecord(n.sons[0], id) if result != nil: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = lookupInRecord(lastSon(n.sons[i]), id) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index ca0425182..bbee27e67 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -27,7 +27,7 @@ proc makeCString*(s: string): Rope = result = nil var res = newStringOfCap(int(s.len.toFloat * 1.1) + 1) add(res, "\"") - for i in countup(0, len(s) - 1): + for i in 0 ..< len(s): if (i + 1) mod MaxLineLength == 0: add(res, "\"\L\"") toCChar(s[i], res) diff --git a/compiler/nimsets.nim b/compiler/nimsets.nim index b00353e20..b13f3be3d 100644 --- a/compiler/nimsets.nim +++ b/compiler/nimsets.nim @@ -18,7 +18,7 @@ proc inSet*(s: PNode, elem: PNode): bool = if s.kind != nkCurly: #internalError(s.info, "inSet") return false - for i in countup(0, sonsLen(s) - 1): + for i in 0 ..< sonsLen(s): if s.sons[i].kind == nkRange: if leValue(s.sons[i].sons[0], elem) and leValue(elem, s.sons[i].sons[1]): @@ -48,7 +48,7 @@ proc someInSet*(s: PNode, a, b: PNode): bool = if s.kind != nkCurly: #internalError(s.info, "SomeInSet") return false - for i in countup(0, sonsLen(s) - 1): + for i in 0 ..< sonsLen(s): if s.sons[i].kind == nkRange: if leValue(s.sons[i].sons[0], b) and leValue(b, s.sons[i].sons[1]) or leValue(s.sons[i].sons[0], a) and leValue(a, s.sons[i].sons[1]): @@ -63,7 +63,7 @@ proc toBitSet*(conf: ConfigRef; s: PNode, b: var TBitSet) = var first, j: BiggestInt first = firstOrd(conf, s.typ.sons[0]) bitSetInit(b, int(getSize(conf, s.typ))) - for i in countup(0, sonsLen(s) - 1): + for i in 0 ..< sonsLen(s): if s.sons[i].kind == nkRange: j = getOrdValue(s.sons[i].sons[0]) while j <= getOrdValue(s.sons[i].sons[1]): @@ -133,7 +133,7 @@ proc equalSets*(conf: ConfigRef; a, b: PNode): bool = proc complement*(conf: ConfigRef; a: PNode): PNode = var x: TBitSet toBitSet(conf, a, x) - for i in countup(0, high(x)): x[i] = not x[i] + for i in 0 .. high(x): x[i] = not x[i] result = toTreeSet(conf, x, a.typ, a.info) proc deduplicate*(conf: ConfigRef; a: PNode): PNode = @@ -150,7 +150,7 @@ proc setHasRange*(s: PNode): bool = assert s.kind == nkCurly if s.kind != nkCurly: return false - for i in countup(0, sonsLen(s) - 1): + for i in 0 ..< sonsLen(s): if s.sons[i].kind == nkRange: return true result = false diff --git a/compiler/packagehandling.nim b/compiler/packagehandling.nim index d7c6b25ae..548668824 100644 --- a/compiler/packagehandling.nim +++ b/compiler/packagehandling.nim @@ -41,7 +41,11 @@ proc getPackageName*(conf: ConfigRef; path: string): string = proc fakePackageName*(conf: ConfigRef; path: AbsoluteFile): string = # foo/../bar becomes foo7_7bar result = relativeTo(path, conf.projectPath, '/').string.multiReplace( - {"/": "7", "..": "_", "7": "77", "_": "__"}) + {"/": "7", "..": "_", "7": "77", "_": "__", ":": "8", "8": "88"}) + +proc demaglePackageName*(path: string): string = + result = path.multiReplace( + {"88": "8", "8": ":", "77": "7", "__": "_", "_7": "../", "7": "/"}) proc withPackageName*(conf: ConfigRef; path: AbsoluteFile): AbsoluteFile = let x = getPackageName(conf, path.string) diff --git a/compiler/passes.nim b/compiler/passes.nim index fb51b3f73..7c6acd936 100644 --- a/compiler/passes.nim +++ b/compiler/passes.nim @@ -67,21 +67,21 @@ proc carryPasses*(g: ModuleGraph; nodes: PNode, module: PSym; proc openPasses(g: ModuleGraph; a: var TPassContextArray; module: PSym) = - for i in countup(0, g.passes.len - 1): + for i in 0 ..< g.passes.len: if not isNil(g.passes[i].open): a[i] = g.passes[i].open(g, module) else: a[i] = nil proc closePasses(graph: ModuleGraph; a: var TPassContextArray) = var m: PNode = nil - for i in countup(0, graph.passes.len - 1): + for i in 0 ..< graph.passes.len: if not isNil(graph.passes[i].close): m = graph.passes[i].close(graph, a[i], m) a[i] = nil # free the memory here proc processTopLevelStmt(graph: ModuleGraph, n: PNode, a: var TPassContextArray): bool = # this implements the code transformation pipeline var m = n - for i in countup(0, graph.passes.len - 1): + for i in 0 ..< graph.passes.len: if not isNil(graph.passes[i].process): m = graph.passes[i].process(a[i], m) if isNil(m): return false diff --git a/compiler/patterns.nim b/compiler/patterns.nim index 1118c8bb5..560382d93 100644 --- a/compiler/patterns.nim +++ b/compiler/patterns.nim @@ -60,7 +60,7 @@ proc sameTrees*(a, b: PNode): bool = of nkType: result = sameTypeOrNil(a.typ, b.typ) else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameTrees(a.sons[i], b.sons[i]): return result = true @@ -182,7 +182,7 @@ proc matches(c: PPatternContext, p, n: PNode): bool = if isPatternParam(c, v) and v.sym.typ.kind == tyVarargs: var arglist: PNode if plen <= sonsLen(n): - for i in countup(0, plen - 2): + for i in 0 .. plen - 2: if not matches(c, p.sons[i], n.sons[i]): return if plen == sonsLen(n) and lastSon(n).kind == nkHiddenStdConv and lastSon(n).sons[1].kind == nkBracket: @@ -194,16 +194,16 @@ proc matches(c: PPatternContext, p, n: PNode): bool = arglist = newNodeI(nkArgList, n.info, sonsLen(n) - plen + 1) # f(1, 2, 3) # p(X) - for i in countup(0, sonsLen(n) - plen): + for i in 0 .. sonsLen(n) - plen: arglist.sons[i] = n.sons[i + plen - 1] return bindOrCheck(c, v.sym, arglist) elif plen-1 == sonsLen(n): - for i in countup(0, plen - 2): + for i in 0 .. plen - 2: if not matches(c, p.sons[i], n.sons[i]): return arglist = newNodeI(nkArgList, n.info) return bindOrCheck(c, v.sym, arglist) if plen == sonsLen(n): - for i in countup(0, sonsLen(p) - 1): + for i in 0 ..< sonsLen(p): if not matches(c, p.sons[i], n.sons[i]): return result = true diff --git a/compiler/platform.nim b/compiler/platform.nim index e1003a385..d5a76024e 100644 --- a/compiler/platform.nim +++ b/compiler/platform.nim @@ -237,13 +237,13 @@ proc setTarget*(t: var Target; o: TSystemOS, c: TSystemCPU) = t.tnl = OS[o].newLine proc nameToOS*(name: string): TSystemOS = - for i in countup(succ(osNone), high(TSystemOS)): + for i in succ(osNone) .. high(TSystemOS): if cmpIgnoreStyle(name, OS[i].name) == 0: return i result = osNone proc nameToCPU*(name: string): TSystemCPU = - for i in countup(succ(cpuNone), high(TSystemCPU)): + for i in succ(cpuNone) .. high(TSystemCPU): if cmpIgnoreStyle(name, CPU[i].name) == 0: return i result = cpuNone diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 8a701d7f3..e49461eea 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -104,7 +104,7 @@ proc illegalCustomPragma*(c: PContext, n: PNode, s: PSym) = proc pragmaAsm*(c: PContext, n: PNode): char = result = '\0' if n != nil: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n.sons[i] if it.kind in nkPragmaCallKinds and it.len == 2 and it.sons[0].kind == nkIdent: case whichKeyword(it.sons[0].ident) @@ -209,7 +209,7 @@ proc processMagic(c: PContext, n: PNode, s: PSym) = var v: string if n.sons[1].kind == nkIdent: v = n.sons[1].ident.s else: v = expectStrLit(c, n) - for m in countup(low(TMagic), high(TMagic)): + for m in low(TMagic) .. high(TMagic): if substr($m, 1) == v: s.magic = m break @@ -423,7 +423,7 @@ proc processPush(c: PContext, n: PNode, start: int) = x.notes = c.config.notes x.features = c.features c.optionStack.add(x) - for i in countup(start, sonsLen(n) - 1): + for i in start ..< sonsLen(n): if not tryProcessOption(c, n.sons[i], c.config.options): # simply store it somewhere: if x.otherPragmas.isNil: diff --git a/compiler/procfind.nim b/compiler/procfind.nim index 3f47e7e8a..55c8bb78c 100644 --- a/compiler/procfind.nim +++ b/compiler/procfind.nim @@ -15,7 +15,7 @@ import proc equalGenericParams(procA, procB: PNode): bool = if sonsLen(procA) != sonsLen(procB): return false - for i in countup(0, sonsLen(procA) - 1): + for i in 0 ..< sonsLen(procA): if procA.sons[i].kind != nkSym: return false if procB.sons[i].kind != nkSym: @@ -98,7 +98,7 @@ when false: var length = sonsLen(child) result = false if length == sonsLen(parent): - for i in countup(1, length - 1): + for i in 1 ..< length: var m = child.sons[i].sym var n = parent.sons[i].sym assert((m.kind == skParam) and (n.kind == skParam)) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 297a0712c..56f57b25a 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -262,7 +262,7 @@ proc putRawStr(g: var TSrcGen, kind: TTokType, s: string) = put(g, kind, str) proc containsNL(s: string): bool = - for i in countup(0, len(s) - 1): + for i in 0 ..< len(s): case s[i] of '\x0D', '\x0A': return true @@ -302,7 +302,7 @@ proc gcom(g: var TSrcGen, n: PNode) = putComment(g, n.comment) #assert(g.comStack[high(g.comStack)] = n); proc gcoms(g: var TSrcGen) = - for i in countup(0, high(g.comStack)): gcom(g, g.comStack[i]) + for i in 0 .. high(g.comStack): gcom(g, g.comStack[i]) popAllComs(g) proc lsub(g: TSrcGen; n: PNode): int @@ -393,7 +393,7 @@ proc atom(g: TSrcGen; n: PNode): string = proc lcomma(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): int = assert(theEnd < 0) result = 0 - for i in countup(start, sonsLen(n) + theEnd): + for i in start .. sonsLen(n) + theEnd: let param = n.sons[i] if nfDefaultParam notin param.flags: inc(result, lsub(g, param)) @@ -404,7 +404,7 @@ proc lcomma(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): int = proc lsons(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): int = assert(theEnd < 0) result = 0 - for i in countup(start, sonsLen(n) + theEnd): inc(result, lsub(g, n.sons[i])) + for i in start .. sonsLen(n) + theEnd: inc(result, lsub(g, n.sons[i])) proc lsub(g: TSrcGen; n: PNode): int = # computes the length of a tree @@ -554,7 +554,7 @@ proc hasCom(n: PNode): bool = case n.kind of nkEmpty..nkNilLit: discard else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if hasCom(n.sons[i]): return true proc putWithSpace(g: var TSrcGen, kind: TTokType, s: string) = @@ -563,7 +563,7 @@ proc putWithSpace(g: var TSrcGen, kind: TTokType, s: string) = proc gcommaAux(g: var TSrcGen, n: PNode, ind: int, start: int = 0, theEnd: int = - 1, separator = tkComma) = - for i in countup(start, sonsLen(n) + theEnd): + for i in start .. sonsLen(n) + theEnd: var c = i < sonsLen(n) + theEnd var sublen = lsub(g, n.sons[i]) + ord(c) if not fits(g, sublen) and (ind + sublen < MaxLineLen): optNL(g, ind) @@ -598,7 +598,7 @@ proc gsemicolon(g: var TSrcGen, n: PNode, start: int = 0, theEnd: int = - 1) = proc gsons(g: var TSrcGen, n: PNode, c: TContext, start: int = 0, theEnd: int = - 1) = - for i in countup(start, sonsLen(n) + theEnd): gsub(g, n.sons[i], c) + for i in start .. sonsLen(n) + theEnd: gsub(g, n.sons[i], c) proc gsection(g: var TSrcGen, n: PNode, c: TContext, kind: TTokType, k: string) = @@ -606,7 +606,7 @@ proc gsection(g: var TSrcGen, n: PNode, c: TContext, kind: TTokType, putWithSpace(g, kind, k) gcoms(g) indentNL(g) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): optNL(g) gsub(g, n.sons[i], c) gcoms(g) @@ -616,7 +616,7 @@ proc longMode(g: TSrcGen; n: PNode, start: int = 0, theEnd: int = - 1): bool = result = n.comment.len > 0 if not result: # check further - for i in countup(start, sonsLen(n) + theEnd): + for i in start .. sonsLen(n) + theEnd: if (lsub(g, n.sons[i]) > MaxLineLen): result = true break @@ -662,7 +662,7 @@ proc gif(g: var TSrcGen, n: PNode) = gcoms(g) # a good place for comments gstmts(g, n.sons[0].sons[1], c) var length = sonsLen(n) - for i in countup(1, length - 1): + for i in 1 ..< length: optNL(g) gsub(g, n.sons[i], c) @@ -1043,7 +1043,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = of nkClosedSymChoice, nkOpenSymChoice: if renderIds in g.flags: put(g, tkParLe, "(") - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if i > 0: put(g, tkOpr, "|") if n.sons[i].kind == nkSym: let s = n[i].sym @@ -1240,7 +1240,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkObject, "object") of nkRecList: indentNL(g) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): optNL(g) gsub(g, n.sons[i], c) gcoms(g) @@ -1336,7 +1336,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = if L > 1: gcoms(g) indentNL(g) - for i in countup(0, L - 1): + for i in 0 ..< L: optNL(g) gsub(g, n.sons[i]) gcoms(g) @@ -1538,7 +1538,7 @@ proc renderModule*(n: PNode, infile, outfile: string, g: TSrcGen initSrcGen(g, renderFlags, conf) g.fid = fid - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): gsub(g, n.sons[i]) optNL(g) case n.sons[i].kind diff --git a/compiler/reorder.nim b/compiler/reorder.nim index 18ec659ba..09168ae6a 100644 --- a/compiler/reorder.nim +++ b/compiler/reorder.nim @@ -75,7 +75,7 @@ proc computeDeps(cache: IdentCache; n: PNode, declares, uses: var IntSet; topLev of nkLetSection, nkVarSection, nkUsingStmt: for a in n: if a.kind in {nkIdentDefs, nkVarTuple}: - for j in countup(0, a.len-3): decl(a[j]) + for j in 0 .. a.len-3: decl(a[j]) for j in a.len-2..a.len-1: deps(a[j]) of nkConstSection, nkTypeSection: for a in n: diff --git a/compiler/rodimpl.nim b/compiler/rodimpl.nim index 147e8c3d6..7a2453caf 100644 --- a/compiler/rodimpl.nim +++ b/compiler/rodimpl.nim @@ -154,7 +154,7 @@ proc encodeNode(g: ModuleGraph; fInfo: TLineInfo, n: PNode, encodeVInt(n.sym.id, result) pushSym(w, n.sym) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): encodeNode(g, n.info, n.sons[i], result) add(result, ')') @@ -248,7 +248,7 @@ proc encodeType(g: ModuleGraph, t: PType, result: var string) = add(result, '\21') encodeVInt(t.typeInst.uniqueId, result) pushType(w, t.typeInst) - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): if t.sons[i] == nil: add(result, "^()") else: diff --git a/compiler/rodutils.nim b/compiler/rodutils.nim index 90431999a..70fc39648 100644 --- a/compiler/rodutils.nim +++ b/compiler/rodutils.nim @@ -56,7 +56,7 @@ proc toStrMaxPrecision*(f: BiggestFloat, literalPostfix = ""): string = result = $buf.cstring proc encodeStr*(s: string, result: var string) = - for i in countup(0, len(s) - 1): + for i in 0 ..< len(s): case s[i] of 'a'..'z', 'A'..'Z', '0'..'9', '_': add(result, s[i]) else: add(result, '\\' & toHex(ord(s[i]), 2)) diff --git a/compiler/ropes.nim b/compiler/ropes.nim index 87026025f..774c266b2 100644 --- a/compiler/ropes.nim +++ b/compiler/ropes.nim @@ -157,7 +157,7 @@ proc `&`*(a: string, b: Rope): Rope = proc `&`*(a: openArray[Rope]): Rope = ## the concatenation operator for an openarray of ropes. - for i in countup(0, high(a)): result = result & a[i] + for i in 0 .. high(a): result = result & a[i] proc add*(a: var Rope, b: Rope) = ## adds `b` to the rope `a`. @@ -206,7 +206,7 @@ proc `$`*(r: Rope): string = proc ropeConcat*(a: varargs[Rope]): Rope = # not overloaded version of concat to speed-up `rfmt` a little bit - for i in countup(0, high(a)): result = result & a[i] + for i in 0 .. high(a): result = result & a[i] proc prepend*(a: var Rope, b: Rope) = a = b & a proc prepend*(a: var Rope, b: string) = a = b & a diff --git a/compiler/sem.nim b/compiler/sem.nim index 66d963e16..c81e11c36 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -492,7 +492,7 @@ proc semConceptBody(c: PContext, n: PNode): PNode include semtypes, semtempl, semgnrc, semstmts, semexprs proc addCodeForGenerics(c: PContext, n: PNode) = - for i in countup(c.lastGenericIdx, c.generics.len - 1): + for i in c.lastGenericIdx ..< c.generics.len: var prc = c.generics[i].inst.sym if prc.kind in {skProc, skFunc, skMethod, skConverter} and prc.magic == mNone: if prc.ast == nil or prc.ast.sons[bodyPos] == nil: diff --git a/compiler/semcall.nim b/compiler/semcall.nim index a5049fc32..232a350b8 100644 --- a/compiler/semcall.nim +++ b/compiler/semcall.nim @@ -157,7 +157,7 @@ proc presentFailedCandidates(c: PContext, n: PNode, errors: CandidateErrors): for err in errors: var errProto = "" let n = err.sym.typ.n - for i in countup(1, n.len - 1): + for i in 1 ..< n.len: var p = n.sons[i] if p.kind == nkSym: add(errProto, typeToString(p.sym.typ, preferName)) @@ -396,7 +396,7 @@ proc resolveOverloads(c: PContext, n, orig: PNode, elif c.config.errorCounter == 0: # don't cascade errors var args = "(" - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if i > 1: add(args, ", ") add(args, typeToString(n.sons[i].typ)) add(args, ")") @@ -613,7 +613,7 @@ proc explicitGenericInstantiation(c: PContext, n: PNode, s: PSym): PNode = # XXX I think this could be improved by reusing sigmatch.paramTypesMatch. # It's good enough for now. result = newNodeI(a.kind, getCallLineInfo(n)) - for i in countup(0, len(a)-1): + for i in 0 ..< len(a): var candidate = a.sons[i].sym if candidate.kind in {skProc, skMethod, skConverter, skFunc, skIterator}: diff --git a/compiler/semdata.nim b/compiler/semdata.nim index 4b269dd4a..637a13101 100644 --- a/compiler/semdata.nim +++ b/compiler/semdata.nim @@ -235,7 +235,7 @@ proc newContext*(graph: ModuleGraph; module: PSym): PContext = proc inclSym(sq: var seq[PSym], s: PSym) = var L = len(sq) - for i in countup(0, L - 1): + for i in 0 ..< L: if sq[i].id == s.id: return setLen(sq, L + 1) sq[L] = s diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index bd7ee1ab3..acdece3fd 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -276,7 +276,7 @@ proc semConv(c: PContext, n: PNode): PNode = localError(c.config, n.info, "illegal conversion from '$1' to '$2'" % [op.typ.typeToString, result.typ.typeToString]) else: - for i in countup(0, sonsLen(op) - 1): + for i in 0 ..< sonsLen(op): let it = op.sons[i] let status = checkConvertible(c, result.typ, it.typ) if status in {convOK, convNotNeedeed}: @@ -316,7 +316,7 @@ proc semLowHigh(c: PContext, n: PNode, m: TMagic): PNode = n.typ = getSysType(c.graph, n.info, tyInt) of tyArray: n.typ = typ.sons[0] # indextype - of tyInt..tyInt64, tyChar, tyBool, tyEnum, tyUInt8, tyUInt16, tyUInt32: + of tyInt..tyInt64, tyChar, tyBool, tyEnum, tyUInt8, tyUInt16, tyUInt32, tyFloat..tyFloat64: # do not skip the range! n.typ = n.sons[1].typ.skipTypes(abstractVar) of tyGenericParam: @@ -428,7 +428,7 @@ proc semIs(c: PContext, n: PNode, flags: TExprFlags): PNode = proc semOpAux(c: PContext, n: PNode) = const flags = {efDetermineType} - for i in countup(1, n.sonsLen-1): + for i in 1 ..< n.sonsLen: var a = n.sons[i] if a.kind == nkExprEqExpr and sonsLen(a) == 2: let info = a.sons[0].info @@ -446,13 +446,13 @@ proc overloadedCallOpr(c: PContext, n: PNode): PNode = else: result = newNodeI(nkCall, n.info) addSon(result, newIdentNode(par, n.info)) - for i in countup(0, sonsLen(n) - 1): addSon(result, n.sons[i]) + for i in 0 ..< sonsLen(n): addSon(result, n.sons[i]) result = semExpr(c, result) proc changeType(c: PContext; n: PNode, newType: PType, check: bool) = case n.kind of nkCurly, nkBracket: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): changeType(c, n.sons[i], elemType(newType), check) of nkPar, nkTupleConstr: let tup = newType.skipTypes({tyGenericInst, tyAlias, tySink, tyDistinct}) @@ -461,7 +461,7 @@ proc changeType(c: PContext; n: PNode, newType: PType, check: bool) = globalError(c.config, n.info, "no tuple type for constructor") elif sonsLen(n) > 0 and n.sons[0].kind == nkExprColonExpr: # named tuple? - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var m = n.sons[i].sons[0] if m.kind != nkSym: globalError(c.config, m.info, "invalid tuple constructor") @@ -475,7 +475,7 @@ proc changeType(c: PContext; n: PNode, newType: PType, check: bool) = else: changeType(c, n.sons[i].sons[1], tup.sons[i], check) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): changeType(c, n.sons[i], tup.sons[i], check) when false: var m = n.sons[i] @@ -523,7 +523,7 @@ proc semArrayConstr(c: PContext, n: PNode, flags: TExprFlags): PNode = var typ = yy.typ addSon(result, yy) #var typ = skipTypes(result.sons[0].typ, {tyGenericInst, tyVar, tyLent, tyOrdinal}) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): x = n.sons[i] if x.kind == nkExprColonExpr and sonsLen(x) == 2: var idx = semConstExpr(c, x.sons[0]) @@ -640,7 +640,7 @@ proc analyseIfAddressTakenInCall(c: PContext, n: PNode) = if n.sons[0].kind == nkSym and n.sons[0].sym.magic in FakeVarParams: # BUGFIX: check for L-Value still needs to be done for the arguments! # note sometimes this is eval'ed twice so we check for nkHiddenAddr here: - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if i < sonsLen(t) and t.sons[i] != nil and skipTypes(t.sons[i], abstractInst-{tyTypeDesc}).kind == tyVar: let it = n[i] @@ -656,7 +656,7 @@ proc analyseIfAddressTakenInCall(c: PContext, n: PNode) = localError(c.config, n.info, errXStackEscape % renderTree(n[1], {renderNoComments})) return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): let n = if n.kind == nkHiddenDeref: n[0] else: n if n.sons[i].kind == nkHiddenCallConv: # we need to recurse explicitly here as converters can create nested @@ -709,13 +709,17 @@ proc evalAtCompileTime(c: PContext, n: PNode): PNode = n.typ.flags.incl tfUnresolved # optimization pass: not necessary for correctness of the semantic pass - if {sfNoSideEffect, sfCompileTime} * callee.flags != {} and + if callee.kind == skConst or + {sfNoSideEffect, sfCompileTime} * callee.flags != {} and {sfForward, sfImportc} * callee.flags == {} and n.typ != nil: - if sfCompileTime notin callee.flags and - optImplicitStatic notin c.config.options: return + + if callee.kind != skConst and + sfCompileTime notin callee.flags and + optImplicitStatic notin c.config.options: return if callee.magic notin ctfeWhitelist: return - if callee.kind notin {skProc, skFunc, skConverter} or callee.isGenericRoutine: + + if callee.kind notin {skProc, skFunc, skConverter, skConst} or callee.isGenericRoutine: return if n.typ != nil and typeAllowed(n.typ, skConst) != nil: return @@ -839,7 +843,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags): PNode = result = n0 result.kind = nkCall result.flags.incl nfExplicitCall - for i in countup(1, sonsLen(n) - 1): addSon(result, n.sons[i]) + for i in 1 ..< sonsLen(n): addSon(result, n.sons[i]) return semExpr(c, result, flags) else: n.sons[0] = n0 @@ -870,7 +874,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags): PNode = else: var hasErrorType = false var msg = "type mismatch: got <" - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if i > 1: add(msg, ", ") let nt = n.sons[i].typ add(msg, typeToString(nt)) @@ -958,7 +962,7 @@ proc lookupInRecordAndBuildCheck(c: PContext, n, r: PNode, field: PIdent, result = nil case r.kind of nkRecList: - for i in countup(0, sonsLen(r) - 1): + for i in 0 ..< sonsLen(r): result = lookupInRecordAndBuildCheck(c, n, r.sons[i], field, check) if result != nil: return of nkRecCase: @@ -968,7 +972,7 @@ proc lookupInRecordAndBuildCheck(c: PContext, n, r: PNode, field: PIdent, if result != nil: return let setType = createSetType(c, r.sons[0].typ) var s = newNodeIT(nkCurly, r.info, setType) - for i in countup(1, sonsLen(r) - 1): + for i in 1 ..< sonsLen(r): var it = r.sons[i] case it.kind of nkOfBranch: @@ -980,7 +984,7 @@ proc lookupInRecordAndBuildCheck(c: PContext, n, r: PNode, field: PIdent, check = newNodeI(nkCheckedFieldExpr, n.info) addSon(check, c.graph.emptyNode) # make space for access node s = newNodeIT(nkCurly, n.info, setType) - for j in countup(0, sonsLen(it) - 2): addSon(s, copyTree(it.sons[j])) + for j in 0 .. sonsLen(it) - 2: addSon(s, copyTree(it.sons[j])) var inExpr = newNodeIT(nkCall, n.info, getSysType(c.graph, n.info, tyBool)) addSon(inExpr, newSymNode(c.graph.opContains, n.info)) addSon(inExpr, s) @@ -1042,7 +1046,7 @@ proc readTypeParameter(c: PContext, typ: PType, let ty = if typ.kind == tyCompositeTypeClass: typ.sons[1].skipGenericAlias else: typ.skipGenericAlias let tbody = ty.sons[0] - for s in countup(0, tbody.len-2): + for s in 0 .. tbody.len-2: let tParam = tbody.sons[s] if tParam.sym.name.id == paramName.id: let rawTyp = ty.sons[s + 1] @@ -1402,7 +1406,7 @@ proc semSubscript(c: PContext, n: PNode, flags: TExprFlags): PNode = tyUncheckedArray: if n.len != 2: return nil n.sons[0] = makeDeref(n.sons[0]) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): n.sons[i] = semExprWithType(c, n.sons[i], flags*{efInTypeof, efDetermineType}) # Arrays index type is dictated by the range's type @@ -1526,19 +1530,52 @@ proc asgnToResultVar(c: PContext, n, le, ri: PNode) {.inline.} = x.typ.flags.incl tfVarIsPtr #echo x.info, " setting it for this type ", typeToString(x.typ), " ", n.info -proc asgnToResult(c: PContext, n, le, ri: PNode) = +proc borrowCheck(c: PContext, n, le, ri: PNode) = + const + PathKinds0 = {nkDotExpr, nkCheckedFieldExpr, + nkBracketExpr, nkAddr, nkHiddenAddr, + nkObjDownConv, nkObjUpConv} + PathKinds1 = {nkHiddenStdConv, nkHiddenSubConv} + + proc getRoot(n: PNode; followDeref: bool): PNode = + result = n + while true: + case result.kind + of nkDerefExpr, nkHiddenDeref: + if followDeref: result = result[0] + else: break + of PathKinds0: + result = result[0] + of PathKinds1: + result = result[1] + else: break + + proc scopedLifetime(c: PContext; ri: PNode): bool {.inline.} = + let n = getRoot(ri, followDeref = false) + result = (ri.kind in nkCallKinds+{nkObjConstr}) or + (n.kind == nkSym and n.sym.owner == c.p.owner) + + proc escapes(c: PContext; le: PNode): bool {.inline.} = + # param[].foo[] = self definitely escapes, we don't need to + # care about pointer derefs: + let n = getRoot(le, followDeref = true) + result = n.kind == nkSym and n.sym.kind == skParam + # Special typing rule: do not allow to pass 'owned T' to 'T' in 'result = x': const absInst = abstractInst - {tyOwned} if ri.typ != nil and ri.typ.skipTypes(absInst).kind == tyOwned and le.typ != nil and le.typ.skipTypes(absInst).kind != tyOwned and - ri.kind in nkCallKinds+{nkObjConstr}: - localError(c.config, n.info, "cannot return an owned pointer as an unowned pointer; " & - "use 'owned(" & typeToString(le.typ) & ")' as the return type") + scopedLifetime(c, ri): + if le.kind == nkSym and le.sym.kind == skResult: + localError(c.config, n.info, "cannot return an owned pointer as an unowned pointer; " & + "use 'owned(" & typeToString(le.typ) & ")' as the return type") + elif escapes(c, le): + localError(c.config, n.info, + "assignment produces a dangling ref: the unowned ref lives longer than the owned ref") template resultTypeIsInferrable(typ: PType): untyped = typ.isMetaType and typ.kind != tyTypeDesc - proc goodLineInfo(arg: PNode): TLineinfo = if arg.kind == nkStmtListExpr and arg.len > 0: goodLineInfo(arg[^1]) @@ -1625,7 +1662,7 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode = c.p.owner.typ.sons[0] = rhsTyp else: typeMismatch(c.config, n.info, lhs.typ, rhsTyp) - asgnToResult(c, n, n.sons[0], rhs) + borrowCheck(c, n, lhs, rhs) n.sons[1] = fitNode(c, le, rhs, goodLineInfo(n[1])) liftTypeBoundOps(c, lhs.typ, lhs.info) @@ -1819,7 +1856,7 @@ proc semExpandToAst(c: PContext, n: PNode): PNode = onUse(n.info, expandedSym) if isCallExpr(macroCall): - for i in countup(1, macroCall.len-1): + for i in 1 ..< macroCall.len: #if macroCall.sons[0].typ.sons[i].kind != tyExpr: macroCall.sons[i] = semExprWithType(c, macroCall[i], {}) # performing overloading resolution here produces too serious regressions: @@ -1890,7 +1927,9 @@ proc processQuotations(c: PContext; n: var PNode, op: string, processQuotations(c, n.sons[i], op, quotes, ids) proc semQuoteAst(c: PContext, n: PNode): PNode = - internalAssert c.config, n.len == 2 or n.len == 3 + if n.len != 2 and n.len != 3: + localError(c.config, n.info, "'quote' expects 1 or 2 arguments") + return n # We transform the do block into a template with a param for # each interpolation. We'll pass this template to getAst. var @@ -2156,7 +2195,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode = whenNimvm = exprNode.sym.magic == mNimvm if whenNimvm: n.flags.incl nfLL - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] case it.kind of nkElifBranch, nkElifExpr: @@ -2199,7 +2238,7 @@ proc semSetConstr(c: PContext, n: PNode): PNode = else: # only semantic checking for all elements, later type checking: var typ: PType = nil - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if isRange(n.sons[i]): checkSonsLen(n.sons[i], 3, c.config) n.sons[i].sons[1] = semExprWithType(c, n.sons[i].sons[1]) @@ -2223,7 +2262,7 @@ proc semSetConstr(c: PContext, n: PNode): PNode = elif lengthOrd(c.config, typ) > MaxSetElements: typ = makeRangeType(c, 0, MaxSetElements-1, n.info) addSonSkipIntLit(result.typ, typ) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var m: PNode let info = n.sons[i].info if isRange(n.sons[i]): @@ -2243,7 +2282,7 @@ proc semTableConstr(c: PContext, n: PNode): PNode = for i in 0..n.len-1: var x = n.sons[i] if x.kind == nkExprColonExpr and sonsLen(x) == 2: - for j in countup(lastKey, i-1): + for j in lastKey ..< i: var pair = newNodeI(nkTupleConstr, x.info) pair.add(n.sons[j]) pair.add(x[1]) @@ -2274,7 +2313,7 @@ proc checkPar(c: PContext; n: PNode): TParKind = else: if n.sons[0].kind == nkExprColonExpr: result = paTupleFields else: result = paTuplePositions - for i in countup(0, length - 1): + for i in 0 ..< length: if result == paTupleFields: if (n.sons[i].kind != nkExprColonExpr) or not (n.sons[i].sons[0].kind in {nkSym, nkIdent}): @@ -2290,7 +2329,7 @@ proc semTupleFieldsConstr(c: PContext, n: PNode, flags: TExprFlags): PNode = var typ = newTypeS(tyTuple, c) typ.n = newNodeI(nkRecList, n.info) # nkIdentDefs var ids = initIntSet() - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n[i].kind != nkExprColonExpr or n[i][0].kind notin {nkSym, nkIdent}: illFormedAst(n.sons[i], c.config) var id: PIdent @@ -2313,7 +2352,7 @@ proc semTuplePositionsConstr(c: PContext, n: PNode, flags: TExprFlags): PNode = result = n # we don't modify n, but compute the type: result.kind = nkTupleConstr var typ = newTypeS(tyTuple, c) # leave typ.n nil! - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): n.sons[i] = semExprWithType(c, n.sons[i], flags*{efAllowDestructor}) addSonSkipIntLit(typ, n.sons[i].typ) result.typ = typ @@ -2321,7 +2360,7 @@ proc semTuplePositionsConstr(c: PContext, n: PNode, flags: TExprFlags): PNode = proc isTupleType(n: PNode): bool = if n.len == 0: return false # don't interpret () as type - for i in countup(0, n.len - 1): + for i in 0 ..< n.len: if n[i].typ == nil or n[i].typ.kind != tyTypeDesc: return false return true diff --git a/compiler/semfields.nim b/compiler/semfields.nim index d65d962cb..88d57576a 100644 --- a/compiler/semfields.nim +++ b/compiler/semfields.nim @@ -55,7 +55,7 @@ proc instFieldLoopBody(c: TFieldInstCtx, n: PNode, forLoop: PNode): PNode = "'continue' not supported in a 'fields' loop") result = copyNode(n) newSons(result, sonsLen(n)) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): result.sons[i] = instFieldLoopBody(c, n.sons[i], forLoop) type diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 5fb2fcd65..4a419a726 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -122,7 +122,7 @@ proc ordinalValToString*(a: PNode; g: ModuleGraph): string = result = $chr(int(x) and 0xff) of tyEnum: var n = t.n - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if n.sons[i].kind != nkSym: internalError(g.config, a.info, "ordinalValToString") var field = n.sons[i].sym if field.position == x: @@ -356,7 +356,7 @@ proc evalOp(m: TMagic, n, a, b, c: PNode; g: ModuleGraph): PNode = proc getConstIfExpr(c: PSym, n: PNode; g: ModuleGraph): PNode = result = nil - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it.len == 2: var e = getConstExpr(c, it.sons[0], g) @@ -512,7 +512,7 @@ proc foldFieldAccess(m: PSym, n: PNode; g: ModuleGraph): PNode = if x == nil or x.kind notin {nkObjConstr, nkPar, nkTupleConstr}: return var field = n.sons[1].sym - for i in countup(ord(x.kind == nkObjConstr), sonsLen(x) - 1): + for i in ord(x.kind == nkObjConstr) ..< sonsLen(x): var it = x.sons[i] if it.kind != nkExprColonExpr: # lookup per index: @@ -527,7 +527,7 @@ proc foldFieldAccess(m: PSym, n: PNode; g: ModuleGraph): PNode = proc foldConStrStr(m: PSym, n: PNode; g: ModuleGraph): PNode = result = newNodeIT(nkStrLit, n.info, n.typ) result.strVal = "" - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): let a = getConstExpr(m, n.sons[i], g) if a == nil: return nil result.strVal.add(getStrOrChar(a)) @@ -617,11 +617,17 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = # If it has no sideEffect, it should be evaluated. But not here. return of mLow: - result = newIntNodeT(firstOrd(g.config, n.sons[1].typ), n, g) + if skipTypes(n.sons[1].typ, abstractVarRange).kind in tyFloat..tyFloat64: + result = newFloatNodeT(firstFloat(n.sons[1].typ), n, g) + else: + result = newIntNodeT(firstOrd(g.config, n.sons[1].typ), n, g) of mHigh: if skipTypes(n.sons[1].typ, abstractVar+{tyUserTypeClassInst}).kind notin {tySequence, tyString, tyCString, tyOpenArray, tyVarargs}: - result = newIntNodeT(lastOrd(g.config, skipTypes(n[1].typ, abstractVar)), n, g) + if skipTypes(n.sons[1].typ, abstractVarRange).kind in tyFloat..tyFloat64: + result = newFloatNodeT(lastFloat(n.sons[1].typ), n, g) + else: + result = newIntNodeT(lastOrd(g.config, skipTypes(n[1].typ, abstractVar)), n, g) else: var a = getArrayConstr(m, n.sons[1], g) if a.kind == nkBracket: @@ -667,7 +673,7 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = n.sons[0] = a of nkBracket: result = copyTree(n) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = getConstExpr(m, n.sons[i], g) if a == nil: return nil result.sons[i] = a @@ -682,14 +688,14 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = addSon(result, b) of nkCurly: result = copyTree(n) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = getConstExpr(m, n.sons[i], g) if a == nil: return nil result.sons[i] = a incl(result.flags, nfAllConst) #of nkObjConstr: # result = copyTree(n) - # for i in countup(1, sonsLen(n) - 1): + # for i in 1 ..< sonsLen(n): # var a = getConstExpr(m, n.sons[i].sons[1]) # if a == nil: return nil # result.sons[i].sons[1] = a @@ -698,12 +704,12 @@ proc getConstExpr(m: PSym, n: PNode; g: ModuleGraph): PNode = # tuple constructor result = copyTree(n) if (sonsLen(n) > 0) and (n.sons[0].kind == nkExprColonExpr): - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = getConstExpr(m, n.sons[i].sons[1], g) if a == nil: return nil result.sons[i].sons[1] = a else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = getConstExpr(m, n.sons[i], g) if a == nil: return nil result.sons[i] = a diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index 0ba6c302f..e63e69f68 100644 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -282,7 +282,7 @@ proc semGenericStmt(c: PContext, n: PNode, # in threads.nim: the subtle preprocessing here binds 'globalsSlot' which # is not exported and yet the generic 'threadProcWrapper' works correctly. let flags = if mixinContext: flags+{withinMixin} else: flags - for i in countup(first, sonsLen(result) - 1): + for i in first ..< sonsLen(result): result.sons[i] = semGenericStmt(c, result.sons[i], flags, ctx) of nkCurlyExpr: result = newNodeI(nkCall, n.info) @@ -316,13 +316,13 @@ proc semGenericStmt(c: PContext, n: PNode, withBracketExpr ctx, a.sons[0]: result = semGenericStmt(c, result, flags, ctx) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semGenericStmt(c, n.sons[i], flags, ctx) of nkIfStmt: - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): n.sons[i] = semGenericStmtScope(c, n.sons[i], flags, ctx) of nkWhenStmt: - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): # bug #8603: conditions of 'when' statements are not # in a 'mixin' context: let it = n[i] @@ -333,17 +333,17 @@ proc semGenericStmt(c: PContext, n: PNode, n.sons[i] = semGenericStmt(c, it, flags+{withinMixin}, ctx) of nkWhileStmt: openScope(c) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): n.sons[i] = semGenericStmt(c, n.sons[i], flags, ctx) closeScope(c) of nkCaseStmt: openScope(c) n.sons[0] = semGenericStmt(c, n.sons[0], flags, ctx) - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var a = n.sons[i] checkMinSonsLen(a, 1, c.config) var L = sonsLen(a) - for j in countup(0, L-2): + for j in 0 .. L-2: a.sons[j] = semGenericStmt(c, a.sons[j], flags, ctx) a.sons[L - 1] = semGenericStmtScope(c, a.sons[L-1], flags, ctx) closeScope(c) @@ -351,7 +351,7 @@ proc semGenericStmt(c: PContext, n: PNode, var L = sonsLen(n) openScope(c) n.sons[L - 2] = semGenericStmt(c, n.sons[L-2], flags, ctx) - for i in countup(0, L - 3): + for i in 0 .. L - 3: if (n.sons[i].kind == nkVarTuple): for s in n.sons[i]: if (s.kind == nkIdent): @@ -372,12 +372,12 @@ proc semGenericStmt(c: PContext, n: PNode, of nkTryStmt, nkHiddenTryStmt: checkMinSonsLen(n, 2, c.config) n.sons[0] = semGenericStmtScope(c, n.sons[0], flags, ctx) - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var a = n.sons[i] checkMinSonsLen(a, 1, c.config) var L = sonsLen(a) openScope(c) - for j in countup(0, L-2): + for j in 0 .. L-2: if a.sons[j].isInfixAs(): addTempDecl(c, getIdentNode(c, a.sons[j][2]), skLet) a.sons[j].sons[1] = semGenericStmt(c, a.sons[j][1], flags+{withinTypeDesc}, ctx) @@ -387,7 +387,7 @@ proc semGenericStmt(c: PContext, n: PNode, closeScope(c) of nkVarSection, nkLetSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkIdentDefs) and (a.kind != nkVarTuple): illFormedAst(a, c.config) @@ -395,20 +395,20 @@ proc semGenericStmt(c: PContext, n: PNode, var L = sonsLen(a) a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx) a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx) - for j in countup(0, L-3): + for j in 0 .. L-3: addTempDecl(c, getIdentNode(c, a.sons[j]), skVar) of nkGenericParams: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if (a.kind != nkIdentDefs): illFormedAst(a, c.config) checkMinSonsLen(a, 3, c.config) var L = sonsLen(a) a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx) # do not perform symbol lookup for default expressions - for j in countup(0, L-3): + for j in 0 .. L-3: addTempDecl(c, getIdentNode(c, a.sons[j]), skType) of nkConstSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkConstDef): illFormedAst(a, c.config) @@ -417,13 +417,13 @@ proc semGenericStmt(c: PContext, n: PNode, a.sons[1] = semGenericStmt(c, a.sons[1], flags+{withinTypeDesc}, ctx) a.sons[2] = semGenericStmt(c, a.sons[2], flags, ctx) of nkTypeSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkTypeDef): illFormedAst(a, c.config) checkSonsLen(a, 3, c.config) addTempDecl(c, getIdentNode(c, a.sons[0]), skType) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkTypeDef): illFormedAst(a, c.config) @@ -439,7 +439,7 @@ proc semGenericStmt(c: PContext, n: PNode, if n.sonsLen > 0: if n.sons[0].kind != nkEmpty: n.sons[0] = semGenericStmt(c, n.sons[0], flags+{withinTypeDesc}, ctx) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): var a: PNode case n.sons[i].kind of nkEnumFieldDef: a = n.sons[i].sons[0] @@ -452,14 +452,14 @@ proc semGenericStmt(c: PContext, n: PNode, checkMinSonsLen(n, 1, c.config) if n.sons[0].kind != nkEmpty: n.sons[0] = semGenericStmt(c, n.sons[0], flags+{withinTypeDesc}, ctx) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): var a = n.sons[i] if (a.kind != nkIdentDefs): illFormedAst(a, c.config) checkMinSonsLen(a, 3, c.config) var L = sonsLen(a) a.sons[L-2] = semGenericStmt(c, a.sons[L-2], flags+{withinTypeDesc}, ctx) a.sons[L-1] = semGenericStmt(c, a.sons[L-1], flags, ctx) - for j in countup(0, L-3): + for j in 0 .. L-3: addTempDecl(c, getIdentNode(c, a.sons[j]), skParam) of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef, nkTemplateDef, nkFuncDef, nkIteratorDef, nkLambdaKinds: @@ -489,7 +489,7 @@ proc semGenericStmt(c: PContext, n: PNode, checkMinSonsLen(n, 2, c.config) result.sons[1] = semGenericStmt(c, n.sons[1], flags, ctx) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semGenericStmt(c, n.sons[i], flags, ctx) when defined(nimsuggest): diff --git a/compiler/seminst.nim b/compiler/seminst.nim index 2423a428b..d8abeb57f 100644 --- a/compiler/seminst.nim +++ b/compiler/seminst.nim @@ -14,11 +14,11 @@ proc addObjFieldsToLocalScope(c: PContext; n: PNode) = template rec(n) = addObjFieldsToLocalScope(c, n) case n.kind of nkRecList: - for i in countup(0, len(n)-1): + for i in 0 ..< len(n): rec n[i] of nkRecCase: if n.len > 0: rec n.sons[0] - for i in countup(1, len(n)-1): + for i in 1 ..< len(n): if n[i].kind in {nkOfBranch, nkElse}: rec lastSon(n[i]) of nkSym: let f = n.sym @@ -152,7 +152,7 @@ proc instantiateBody(c: PContext, n, params: PNode, result, orig: PSym) = dec c.inGenericInst proc fixupInstantiatedSymbols(c: PContext, s: PSym) = - for i in countup(0, c.generics.len - 1): + for i in 0 ..< c.generics.len: if c.generics[i].genericSym.id == s.id: var oldPrc = c.generics[i].inst.sym pushProcCon(c, oldPrc) diff --git a/compiler/semmacrosanity.nim b/compiler/semmacrosanity.nim index 3056f5d72..02c6c86e6 100644 --- a/compiler/semmacrosanity.nim +++ b/compiler/semmacrosanity.nim @@ -16,14 +16,14 @@ proc ithField(n: PNode, field: var int): PSym = result = nil case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = ithField(n.sons[i], field) if result != nil: return of nkRecCase: if n.sons[0].kind != nkSym: return result = ithField(n.sons[0], field) if result != nil: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = ithField(lastSon(n.sons[i]), field) diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 7fd2bd5b6..557e5d3f7 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -386,7 +386,7 @@ proc trackTryStmt(tracked: PEffects, n: PNode) = if blen == 1: catchesAll(tracked) else: - for j in countup(0, blen - 2): + for j in 0 .. blen - 2: if b.sons[j].isInfixAs(): assert(b.sons[j][1].kind == nkType) catches(tracked, b.sons[j][1].typ) @@ -430,7 +430,7 @@ proc isForwardedProc(n: PNode): bool = result = n.kind == nkSym and sfForward in n.sym.flags proc trackPragmaStmt(tracked: PEffects, n: PNode) = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if whichPragma(it) == wEffects: # list the computed effects up to here: @@ -527,7 +527,7 @@ proc isNoEffectList(n: PNode): bool {.inline.} = n.len == 0 or (n[tagEffects] == nil and n[exceptionEffects] == nil) proc isTrival(caller: PNode): bool {.inline.} = - result = caller.kind == nkSym and caller.sym.magic in {mEqProc, mIsNil} + result = caller.kind == nkSym and caller.sym.magic in {mEqProc, mIsNil, mMove, mWasMoved} proc trackOperand(tracked: PEffects, n: PNode, paramType: PType; caller: PNode) = let a = skipConvAndClosure(n) diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index a0a1caf7f..6a92e9221 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -153,7 +153,7 @@ proc semIf(c: PContext, n: PNode; flags: TExprFlags): PNode = result = n var typ = commonTypeBegin var hasElse = false - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it.len == 2: openScope(c) @@ -207,7 +207,7 @@ proc semTry(c: PContext, n: PNode; flags: TExprFlags): PNode = var last = sonsLen(n) - 1 var catchAllExcepts = 0 - for i in countup(1, last): + for i in 1 .. last: let a = n.sons[i] checkMinSonsLen(a, 1, c.config) openScope(c) @@ -356,7 +356,7 @@ proc isDiscardUnderscore(v: PSym): bool = proc semUsing(c: PContext; n: PNode): PNode = result = c.graph.emptyNode if not isTopLevel(c): localError(c.config, n.info, errXOnlyAtModuleScope % "using") - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if c.config.cmd == cmdIdeTools: suggestStmt(c, a) if a.kind == nkCommentStmt: continue @@ -365,7 +365,7 @@ proc semUsing(c: PContext; n: PNode): PNode = var length = sonsLen(a) if a.sons[length-2].kind != nkEmpty: let typ = semTypeNode(c, a.sons[length-2], nil) - for j in countup(0, length-3): + for j in 0 .. length-3: let v = semIdentDef(c, a.sons[j], skParam) styleCheckDef(c.config, v) onDef(a[j].info, v) @@ -430,7 +430,7 @@ proc setVarType(c: PContext; v: PSym, typ: PType) = proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = var b: PNode result = copyNode(n) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if c.config.cmd == cmdIdeTools: suggestStmt(c, a) if a.kind == nkCommentStmt: continue @@ -504,7 +504,7 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = a.kind == nkIdentDefs and a.len > 3: message(c.config, a.info, warnEachIdentIsTuple) - for j in countup(0, length-3): + for j in 0 .. length-3: if a[j].kind == nkDotExpr: fillPartialObject(c, a[j], if a.kind != nkVarTuple: typ else: tup.sons[j]) @@ -572,7 +572,7 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = proc semConst(c: PContext, n: PNode): PNode = result = copyNode(n) inc c.inStaticContext - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if c.config.cmd == cmdIdeTools: suggestStmt(c, a) if a.kind == nkCommentStmt: continue @@ -624,7 +624,7 @@ proc semConst(c: PContext, n: PNode): PNode = b.sons[length-2] = a.sons[length-2] b.sons[length-1] = def - for j in countup(0, length-3): + for j in 0 .. length-3: var v = semIdentDef(c, a.sons[j], skConst) if sfGenSym notin v.flags: addInterfaceDecl(c, v) elif v.owner == nil: v.owner = getCurrOwner(c) @@ -700,7 +700,7 @@ proc semForVars(c: PContext, n: PNode; flags: TExprFlags): PNode = elif length-2 != sonsLen(iter): localError(c.config, n.info, errWrongNumberOfVariables) else: - for i in countup(0, length - 3): + for i in 0 .. length - 3: if n.sons[i].kind == nkVarTuple: var mutable = false if iter[i].kind == tyVar: @@ -880,7 +880,7 @@ proc semCase(c: PContext, n: PNode; flags: TExprFlags): PNode = localError(c.config, n.info, errSelectorMustBeOfCertainTypes) return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): var x = n.sons[i] when defined(nimsuggest): if c.config.ideCmd == ideSug and exactEquals(c.config.m.trackPos, x.info) and caseTyp.kind == tyEnum: @@ -949,7 +949,7 @@ proc semRaise(c: PContext, n: PNode): PNode = proc addGenericParamListToScope(c: PContext, n: PNode) = if n.kind != nkGenericParams: illFormedAst(n, c.config) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkSym: addDecl(c, a.sym) else: illFormedAst(a, c.config) @@ -966,7 +966,7 @@ proc typeSectionTypeName(c: PContext; n: PNode): PNode = proc typeSectionLeftSidePass(c: PContext, n: PNode) = # process the symbols on the left side for the whole type section, before # we even look at the type definitions on the right - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] when defined(nimsuggest): if c.config.cmd == cmdIdeTools: @@ -1100,7 +1100,7 @@ proc checkCovariantParamsUsages(c: PContext; genericType: PType) = discard traverseSubTypes(c, body) proc typeSectionRightSidePass(c: PContext, n: PNode) = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if a.kind != nkTypeDef: illFormedAst(a, c.config) @@ -1227,7 +1227,7 @@ proc checkForMetaFields(c: PContext; n: PNode) = internalAssert c.config, false proc typeSectionFinalPass(c: PContext, n: PNode) = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue let name = typeSectionTypeName(c, a.sons[0]) @@ -1323,7 +1323,7 @@ proc semParamList(c: PContext, n, genericParams: PNode, s: PSym) = s.typ = semProcTypeNode(c, n, genericParams, nil, s.kind) proc addParams(c: PContext, n: PNode, kind: TSymKind) = - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): if n.sons[i].kind == nkSym: addParamOrResult(c, n.sons[i].sym, kind) else: illFormedAst(n, c.config) @@ -1359,7 +1359,7 @@ proc semProcAnnotation(c: PContext, prc: PNode; validPragmas: TSpecialWords): PNode = var n = prc.sons[pragmasPos] if n == nil or n.kind == nkEmpty: return - for i in countup(0, n.len-1): + for i in 0 ..< n.len: var it = n.sons[i] var key = if it.kind in nkPragmaCallKinds and it.len >= 1: it.sons[0] else: it @@ -1666,7 +1666,7 @@ type proc hasObjParam(s: PSym): bool = var t = s.typ - for col in countup(1, sonsLen(t)-1): + for col in 1 ..< sonsLen(t): if skipTypes(t.sons[col], skipPtrs).kind == tyObject: return true @@ -1680,7 +1680,7 @@ proc semMethodPrototype(c: PContext; s: PSym; n: PNode) = var foundObj = false # we start at 1 for now so that tparsecombnum continues to compile. # XXX Revisit this problem later. - for col in countup(1, sonsLen(tt)-1): + for col in 1 ..< sonsLen(tt): let t = tt.sons[col] if t != nil and t.kind == tyGenericInvocation: var x = skipTypes(t.sons[0], {tyVar, tyLent, tyPtr, tyRef, tyGenericInst, @@ -2007,7 +2007,7 @@ proc incMod(c: PContext, n: PNode, it: PNode, includeStmtResult: PNode) = proc evalInclude(c: PContext, n: PNode): PNode = result = newNodeI(nkStmtList, n.info) addSon(result, n) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var imp: PNode let it = n.sons[i] if it.kind == nkInfix and it.len == 3 and it[2].kind == nkBracket: @@ -2096,7 +2096,7 @@ proc semStmtList(c: PContext, n: PNode, flags: TExprFlags): PNode = #while last > 0 and n.sons[last].kind in {nkPragma, nkCommentStmt, # nkNilLit, nkEmpty}: # dec last - for i in countup(0, length - 1): + for i in 0 ..< length: var expr = semExpr(c, n.sons[i], flags) n.sons[i] = expr if c.matchedConcept != nil and expr.typ != nil and @@ -2132,7 +2132,7 @@ proc semStmtList(c: PContext, n: PNode, flags: TExprFlags): PNode = if n.sons[i].kind in LastBlockStmts or n.sons[i].kind in nkCallKinds and n.sons[i][0].kind == nkSym and sfNoReturn in n.sons[i][0].sym.flags: - for j in countup(i + 1, length - 1): + for j in i + 1 ..< length: case n.sons[j].kind of nkPragma, nkCommentStmt, nkNilLit, nkEmpty, nkBlockExpr, nkBlockStmt, nkState: discard diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index 2854c90ae..4b283f793 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -34,7 +34,7 @@ type spNone, spGenSym, spInject proc symBinding(n: PNode): TSymBinding = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] var key = if it.kind == nkExprColonExpr: it.sons[0] else: it if key.kind == nkIdent: @@ -251,7 +251,7 @@ proc semRoutineInTemplName(c: var TemplCtx, n: PNode): PNode = result = newSymNode(s, n.info) onUse(n.info, s) else: - for i in countup(0, safeLen(n) - 1): + for i in 0 ..< safeLen(n): result.sons[i] = semRoutineInTemplName(c, n.sons[i]) proc semRoutineInTemplBody(c: var TemplCtx, n: PNode, k: TSymKind): PNode = @@ -286,7 +286,7 @@ proc semRoutineInTemplBody(c: var TemplCtx, n: PNode, k: TSymKind): PNode = closeScope(c) proc semTemplSomeDecl(c: var TemplCtx, n: PNode, symKind: TSymKind; start=0) = - for i in countup(start, sonsLen(n) - 1): + for i in start ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkIdentDefs) and (a.kind != nkVarTuple): illFormedAst(a, c.c.config) @@ -298,7 +298,7 @@ proc semTemplSomeDecl(c: var TemplCtx, n: PNode, symKind: TSymKind; start=0) = when defined(nimsuggest): dec c.c.inTypeContext a.sons[L-1] = semTemplBody(c, a.sons[L-1]) - for j in countup(0, L-3): + for j in 0 .. L-3: addLocalDecl(c, a.sons[j], symKind) proc semPattern(c: PContext, n: PNode): PNode @@ -342,7 +342,7 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = of nkEmpty, nkSym..nkNilLit, nkComesFrom: discard of nkIfStmt: - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it.len == 2: openScope(c) @@ -353,17 +353,17 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = n.sons[i] = semTemplBodyScope(c, it) of nkWhileStmt: openScope(c) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): n.sons[i] = semTemplBody(c, n.sons[i]) closeScope(c) of nkCaseStmt: openScope(c) n.sons[0] = semTemplBody(c, n.sons[0]) - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var a = n.sons[i] checkMinSonsLen(a, 1, c.c.config) var L = sonsLen(a) - for j in countup(0, L-2): + for j in 0 .. L-2: a.sons[j] = semTemplBody(c, a.sons[j]) a.sons[L-1] = semTemplBodyScope(c, a.sons[L-1]) closeScope(c) @@ -371,8 +371,12 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = var L = sonsLen(n) openScope(c) n.sons[L-2] = semTemplBody(c, n.sons[L-2]) - for i in countup(0, L - 3): - addLocalDecl(c, n.sons[i], skForVar) + for i in 0 .. L - 3: + if n[i].kind == nkVarTuple: + for j in 0 ..< sonsLen(n[i])-1: + addLocalDecl(c, n[i][j], skForVar) + else: + addLocalDecl(c, n.sons[i], skForVar) openScope(c) n.sons[L-1] = semTemplBody(c, n.sons[L-1]) closeScope(c) @@ -394,12 +398,12 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = of nkTryStmt, nkHiddenTryStmt: checkMinSonsLen(n, 2, c.c.config) n.sons[0] = semTemplBodyScope(c, n.sons[0]) - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var a = n.sons[i] checkMinSonsLen(a, 1, c.c.config) var L = sonsLen(a) openScope(c) - for j in countup(0, L-2): + for j in 0 .. L-2: if a.sons[j].isInfixAs(): addLocalDecl(c, a.sons[j].sons[2], skLet) a.sons[j].sons[1] = semTemplBody(c, a.sons[j][1]) @@ -414,7 +418,7 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = n.sons[0] = semTemplBody(c, n.sons[0]) semTemplSomeDecl(c, n, skParam, 1) of nkConstSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkConstDef): illFormedAst(a, c.c.config) @@ -423,13 +427,13 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = a.sons[1] = semTemplBody(c, a.sons[1]) a.sons[2] = semTemplBody(c, a.sons[2]) of nkTypeSection: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkTypeDef): illFormedAst(a, c.c.config) checkSonsLen(a, 3, c.c.config) addLocalDecl(c, a.sons[0], skType) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind == nkCommentStmt: continue if (a.kind != nkTypeDef): illFormedAst(a, c.c.config) @@ -548,7 +552,7 @@ proc semTemplBodyDirty(c: var TemplCtx, n: PNode): PNode = if s != nil and contains(c.toBind, s.id): return symChoice(c.c, n, s, scClosed) result = n - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semTemplBodyDirty(c, n.sons[i]) proc semTemplateDef(c: PContext, n: PNode): PNode = @@ -710,7 +714,7 @@ proc semPatternBody(c: var TemplCtx, n: PNode): PNode = if stupidStmtListExpr(n): result = semPatternBody(c, n.lastSon) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semPatternBody(c, n.sons[i]) of nkCallKinds: let s = qualifiedLookUp(c.c, n.sons[0], {}) @@ -743,7 +747,7 @@ proc semPatternBody(c: var TemplCtx, n: PNode): PNode = result.sons[1] = semPatternBody(c, n.sons[1]) return - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semPatternBody(c, n.sons[i]) else: # dotExpr is ambiguous: note that we explicitly allow 'x.TemplateParam', @@ -759,7 +763,7 @@ proc semPatternBody(c: var TemplCtx, n: PNode): PNode = of nkPar: if n.len == 1: return semPatternBody(c, n.sons[0]) else: discard - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result.sons[i] = semPatternBody(c, n.sons[i]) proc semPattern(c: PContext, n: PNode): PNode = diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index d0c8c8520..f37e8263e 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -38,12 +38,6 @@ const errNoGenericParamsAllowedForX = "no generic parameters allowed for $1" errInOutFlagNotExtern = "the '$1' modifier can be used only with imported types" -const - mStaticTy = {mStatic} - mTypeTy = {mType, mTypeOf} - # XXX: This should be needed only temporarily until the C - # sources are rebuilt - proc newOrPrevType(kind: TTypeKind, prev: PType, c: PContext): PType = if prev == nil: result = newTypeS(kind, c) @@ -81,7 +75,7 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType = var symbols: TStrTable if isPure: initStrTable(symbols) var hasNull = false - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): if n.sons[i].kind == nkEmpty: continue case n.sons[i].kind of nkEnumFieldDef: @@ -386,7 +380,7 @@ proc semTypeIdent(c: PContext, n: PNode): PSym = else: localError(c.config, n.info, errTypeExpected) return errorSym(c, n) - if result.kind != skType and result.magic notin (mStaticTy + mTypeTy): + if result.kind != skType and result.magic notin {mStatic, mType, mTypeOf}: # this implements the wanted ``var v: V, x: V`` feature ... var ov: TOverloadIter var amb = initOverloadIter(ov, c, n) @@ -425,7 +419,7 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType = result.n = newNodeI(nkRecList, n.info) var check = initIntSet() var counter = 0 - for i in countup(ord(n.kind == nkBracketExpr), sonsLen(n) - 1): + for i in ord(n.kind == nkBracketExpr) ..< sonsLen(n): var a = n.sons[i] if (a.kind != nkIdentDefs): illFormedAst(a, c.config) checkMinSonsLen(a, 3, c.config) @@ -437,7 +431,7 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType = typ = errorType(c) if a.sons[length - 1].kind != nkEmpty: localError(c.config, a.sons[length - 1].info, errInitHereNotAllowed) - for j in countup(0, length - 3): + for j in 0 .. length - 3: var field = newSymG(skField, a.sons[j], c) field.typ = typ field.position = counter @@ -495,8 +489,8 @@ proc semIdentWithPragma(c: PContext, kind: TSymKind, n: PNode, proc checkForOverlap(c: PContext, t: PNode, currentEx, branchIndex: int) = let ex = t[branchIndex][currentEx].skipConv - for i in countup(1, branchIndex): - for j in countup(0, sonsLen(t.sons[i]) - 2): + for i in 1 .. branchIndex: + for j in 0 .. sonsLen(t.sons[i]) - 2: if i == branchIndex and j == currentEx: break if overlap(t.sons[i].sons[j].skipConv, ex): localError(c.config, ex.info, errDuplicateCaseLabel) @@ -619,7 +613,7 @@ proc semRecordCase(c: PContext, n: PNode, check: var IntSet, pos: var int, else: if not isOrdinalType(typ): localError(c.config, n.info, "selector must be of an ordinal type, float or string") - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): var b = copyTree(n.sons[i]) addSon(a, b) case n.sons[i].kind @@ -648,7 +642,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int, case n.kind of nkRecWhen: var branch: PNode = nil # the branch to take - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it == nil: illFormedAst(n, c.config) var idx = 1 @@ -685,7 +679,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int, of nkRecList: # attempt to keep the nesting at a sane level: var a = if father.kind == nkRecList: father else: copyNode(n) - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): semRecordNodeAux(c, n.sons[i], check, pos, a, rectype) if a != father: addSon(father, a) of nkIdentDefs: @@ -705,7 +699,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int, propagateToOwner(rectype, typ) var fieldOwner = if c.inGenericContext > 0: c.getCurrOwner else: rectype.sym - for i in countup(0, sonsLen(n)-3): + for i in 0 .. sonsLen(n)-3: var f = semIdentWithPragma(c, skField, n.sons[i], {sfExported}) suggestSym(c.config, n.sons[i].info, f, c.graph.usageSym) f.typ = typ @@ -739,13 +733,13 @@ proc addInheritedFieldsAux(c: PContext, check: var IntSet, pos: var int, of nkRecCase: if (n.sons[0].kind != nkSym): internalError(c.config, n.info, "addInheritedFieldsAux") addInheritedFieldsAux(c, check, pos, n.sons[0]) - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: addInheritedFieldsAux(c, check, pos, lastSon(n.sons[i])) else: internalError(c.config, n.info, "addInheritedFieldsAux(record case branch)") of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): addInheritedFieldsAux(c, check, pos, n.sons[i]) of nkSym: incl(check, n.sym.name.id) @@ -900,7 +894,7 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode, let finalTypId = if typId != nil: typId else: getIdent(c.cache, paramName & ":type") # is this a bindOnce type class already present in the param list? - for i in countup(0, genericParams.len - 1): + for i in 0 ..< genericParams.len: if genericParams.sons[i].sym.name.id == finalTypId.id: return genericParams.sons[i].typ @@ -950,7 +944,8 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode, if tfUnresolved notin paramType.flags: # naked typedescs are not bindOnce types if paramType.base.kind == tyNone and paramTypId != nil and - paramTypId.id == getIdent(c.cache, "typedesc").id: + (paramTypId.id == getIdent(c.cache, "typedesc").id or + paramTypId.id == getIdent(c.cache, "type").id): # XXX Why doesn't this check for tyTypeDesc instead? paramTypId = nil let t = c.newTypeWithSons(tyTypeDesc, @[paramType.base]) @@ -1035,7 +1030,7 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode, if lifted != nil: paramType.sons[i] = lifted let body = paramType.base - if body.kind == tyForward: + if body.kind in {tyForward, tyError}: # this may happen for proc type appearing in a type section # before one of its param types return @@ -1091,7 +1086,7 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode, var check = initIntSet() var counter = 0 - for i in countup(1, n.len - 1): + for i in 1 ..< n.len: var a = n.sons[i] if a.kind != nkIdentDefs: # for some generic instantiations the passed ':env' parameter @@ -1133,6 +1128,9 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode, if typ == nil: typ = def.typ + if isEmptyContainer(typ): + localError(c.config, a.info, "cannot infer the type of parameter '" & a[0].ident.s & "'") + if typ.kind == tyTypeDesc: # consider a proc such as: # proc takesType(T = int) @@ -1161,7 +1159,7 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode, elif skipTypes(typ, {tyGenericInst, tyAlias, tySink}).kind == tyVoid: continue - for j in countup(0, length-3): + for j in 0 .. length-3: var arg = newSymG(skParam, a.sons[j], c) if not hasType and not hasDefault and kind notin {skTemplate, skMacro}: let param = strTableGet(c.signatures, arg.name) @@ -1239,7 +1237,7 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode, proc semStmtListType(c: PContext, n: PNode, prev: PType): PType = checkMinSonsLen(n, 1, c.config) var length = sonsLen(n) - for i in countup(0, length - 2): + for i in 0 .. length - 2: n.sons[i] = semStmt(c, n.sons[i], {}) if length > 0: result = semTypeNode(c, n.sons[length - 1], prev) @@ -1303,7 +1301,7 @@ proc semGeneric(c: PContext, n: PNode, s: PSym, prev: PType): PType = else: addSonSkipIntLit(result, typ) if t.kind == tyForward: - for i in countup(1, sonsLen(n)-1): + for i in 1 ..< sonsLen(n): var elem = semGenericParamInInvocation(c, n.sons[i]) addToResult(elem) return @@ -1633,16 +1631,16 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = incl result.flags, tfHasAsgn of mOpt: result = semContainer(c, n, tyOpt, "opt", prev) of mVarargs: result = semVarargs(c, n, prev) - of mTypeDesc, mTypeTy: + of mTypeDesc, mType, mTypeOf: result = makeTypeDesc(c, semTypeNode(c, n[1], nil)) result.flags.incl tfExplicit - of mStaticTy: + of mStatic: result = semStaticType(c, n[1], prev) of mExpr: result = semTypeNode(c, n.sons[0], nil) if result != nil: result = copyType(result, getCurrOwner(c), false) - for i in countup(1, n.len - 1): + for i in 1 ..< n.len: result.rawAddSon(semTypeNode(c, n.sons[i], nil)) of mDistinct: result = newOrPrevType(tyDistinct, prev, c) @@ -1883,7 +1881,7 @@ proc semGenericParamList(c: PContext, n: PNode, father: PType = nil): PNode = if n.kind != nkGenericParams: illFormedAst(n, c.config) return - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): var a = n.sons[i] if a.kind != nkIdentDefs: illFormedAst(n, c.config) let L = a.len @@ -1919,7 +1917,7 @@ proc semGenericParamList(c: PContext, n: PNode, father: PType = nil): PNode = typ.flags.incl tfGenericTypeParam - for j in countup(0, L-3): + for j in 0 .. L-3: let finalType = if j == 0: typ else: copyType(typ, typ.owner, false) # it's important the we create an unique diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index 5d2c4203c..e5a51b50d 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -63,11 +63,10 @@ proc cacheTypeInst*(inst: PType) = # update the refcount let gt = inst.sons[0] let t = if gt.kind == tyGenericBody: gt.lastSon else: gt - if t.kind in {tyStatic, tyGenericParam} + tyTypeClasses: + if t.kind in {tyStatic, tyError, tyGenericParam} + tyTypeClasses: return gt.sym.typeInstCache.add(inst) - type LayeredIdTable* = object topLayer*: TIdTable @@ -170,7 +169,7 @@ proc replaceObjBranches(cl: TReplTypeVars, n: PNode): PNode = discard of nkRecWhen: var branch: PNode = nil # the branch to take - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it == nil: illFormedAst(n, cl.c.config) case it.kind @@ -209,7 +208,7 @@ proc replaceTypeVarsN(cl: var TReplTypeVars, n: PNode; start=0): PNode = result = newNode(nkRecList, n.info) of nkRecWhen: var branch: PNode = nil # the branch to take - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it == nil: illFormedAst(n, cl.c.config) case it.kind @@ -239,7 +238,7 @@ proc replaceTypeVarsN(cl: var TReplTypeVars, n: PNode; start=0): PNode = newSons(result, length) if start > 0: result.sons[0] = n.sons[0] - for i in countup(start, length - 1): + for i in start ..< length: result.sons[i] = replaceTypeVarsN(cl, n.sons[i]) proc replaceTypeVarsS(cl: var TReplTypeVars, s: PSym): PSym = @@ -311,7 +310,7 @@ proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType = when defined(reportCacheHits): echo "Generic instantiation cached ", typeToString(result), " for ", typeToString(t) return - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): var x = t.sons[i] if x.kind in {tyGenericParam}: x = lookupTypeVar(cl, x) @@ -351,18 +350,21 @@ proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType = var typeMapLayer = newTypeMapLayer(cl) cl.typeMap = addr(typeMapLayer) - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): var x = replaceTypeVarsT(cl, t.sons[i]) assert x.kind != tyGenericInvocation header.sons[i] = x propagateToOwner(header, x) cl.typeMap.put(body.sons[i-1], x) - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): # if one of the params is not concrete, we cannot do anything # but we already raised an error! rawAddSon(result, header.sons[i]) + if body.kind == tyError: + return + let bbody = lastSon body var newbody = replaceTypeVarsT(cl, bbody) let bodyIsNew = newbody != bbody @@ -560,7 +562,7 @@ proc replaceTypeVarsTAux(cl: var TReplTypeVars, t: PType): PType = #if not cl.allowMetaTypes: idTablePut(cl.localCache, t, result) - for i in countup(0, sonsLen(result) - 1): + for i in 0 ..< sonsLen(result): if result.sons[i] != nil: if result.sons[i].kind == tyGenericBody: localError(cl.c.config, t.sym.info, diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim index c69d58cd3..046479de4 100644 --- a/compiler/sighashes.nim +++ b/compiler/sighashes.nim @@ -36,6 +36,7 @@ type CoOwnerSig CoIgnoreRange CoConsiderOwned + CoDistinct proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) @@ -94,10 +95,14 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) = case t.kind of tyGenericInvocation: - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): c.hashType t.sons[i], flags of tyDistinct: - if {CoType, CoConsiderOwned} * flags == {CoType} or t.sym == nil: + if CoDistinct in flags: + if t.sym != nil: c.hashSym(t.sym) + if t.sym == nil or tfFromGeneric in t.flags: + c.hashType t.lastSon, flags + elif CoType in flags or t.sym == nil: c.hashType t.lastSon, flags else: c.hashSym(t.sym) @@ -129,7 +134,7 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) = let inst = t.typeInst t.typeInst = nil assert inst.kind == tyGenericInst - for i in countup(0, inst.len - 2): + for i in 0 .. inst.len - 2: c.hashType inst.sons[i], flags t.typeInst = inst return @@ -178,14 +183,14 @@ proc hashType(c: var MD5Context, t: PType; flags: set[ConsiderFlag]) = c &= char(t.kind) if t.n != nil and CoType notin flags: assert(sonsLen(t.n) == sonsLen(t)) - for i in countup(0, sonsLen(t.n) - 1): + for i in 0 ..< sonsLen(t.n): assert(t.n.sons[i].kind == nkSym) c &= t.n.sons[i].sym.name.s c &= ':' c.hashType(t.sons[i], flags+{CoIgnoreRange}) c &= ',' else: - for i in countup(0, sonsLen(t) - 1): c.hashType t.sons[i], flags+{CoIgnoreRange} + for i in 0 ..< sonsLen(t): c.hashType t.sons[i], flags+{CoIgnoreRange} of tyRange: if CoIgnoreRange notin flags: c &= char(t.kind) diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 194055da9..326de1706 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -295,7 +295,7 @@ proc argTypeToString(arg: PNode; prefer: TPreferedDesc): string = proc describeArgs*(c: PContext, n: PNode, startIdx = 1; prefer: TPreferedDesc = preferName): string = result = "" - for i in countup(startIdx, n.len - 1): + for i in startIdx ..< n.len: var arg = n.sons[i] if n.sons[i].kind == nkExprEqExpr: add(result, renderTree(n.sons[i].sons[0])) @@ -435,7 +435,7 @@ proc handleFloatRange(f, a: PType): TTypeRelation = proc genericParamPut(c: var TCandidate; last, fGenericOrigin: PType) = if fGenericOrigin != nil and last.kind == tyGenericInst and last.len-1 == fGenericOrigin.len: - for i in countup(1, sonsLen(fGenericOrigin) - 1): + for i in 1 ..< sonsLen(fGenericOrigin): let x = PType(idTableGet(c.bindings, fGenericOrigin.sons[i])) if x == nil: put(c, fGenericOrigin.sons[i], last.sons[i]) @@ -517,12 +517,12 @@ proc recordRel(c: var TCandidate, f, a: PType): TTypeRelation = result = isEqual let firstField = if f.kind == tyTuple: 0 else: 1 - for i in countup(firstField, sonsLen(f) - 1): + for i in firstField ..< sonsLen(f): var m = typeRel(c, f.sons[i], a.sons[i]) if m < isSubtype: return isNone result = minRel(result, m) if f.n != nil and a.n != nil: - for i in countup(0, sonsLen(f.n) - 1): + for i in 0 ..< sonsLen(f.n): # check field names: if f.n.sons[i].kind != nkSym: return isNone elif a.n.sons[i].kind != nkSym: return isNone @@ -1484,7 +1484,7 @@ proc typeRelImpl(c: var TCandidate, f, aOrig: PType, elif x.kind == tyGenericInst and ((f.sons[0] == x.sons[0]) or isGenericSubType(c, x, f, depth)) and (sonsLen(x) - 1 == sonsLen(f)): - for i in countup(1, sonsLen(f) - 1): + for i in 1 ..< sonsLen(f): if x.sons[i].kind == tyGenericParam: internalError(c.c.graph.config, "wrong instantiated type!") elif typeRel(c, f.sons[i], x.sons[i]) <= isSubtype: @@ -1513,7 +1513,7 @@ proc typeRelImpl(c: var TCandidate, f, aOrig: PType, # var it1 = internalFind(root, 312) # cannot instantiate: 'D' # # we steal the generic parameters from the tyGenericBody: - for i in countup(1, sonsLen(f) - 1): + for i in 1 ..< sonsLen(f): let x = PType(idTableGet(c.bindings, genericBody.sons[i-1])) if x == nil: discard "maybe fine (for eg. a==tyNil)" @@ -1830,7 +1830,7 @@ proc implicitConv(kind: TNodeKind, f: PType, arg: PNode, m: TCandidate, proc userConvMatch(c: PContext, m: var TCandidate, f, a: PType, arg: PNode): PNode = result = nil - for i in countup(0, len(c.converters) - 1): + for i in 0 ..< len(c.converters): var src = c.converters[i].typ.sons[1] var dest = c.converters[i].typ.sons[0] # for generic type converters we need to check 'src <- a' before diff --git a/compiler/sizealignoffsetimpl.nim b/compiler/sizealignoffsetimpl.nim index 45febeea8..66fb3dc5b 100644 --- a/compiler/sizealignoffsetimpl.nim +++ b/compiler/sizealignoffsetimpl.nim @@ -337,7 +337,7 @@ proc computeSizeAlign(conf: ConfigRef; typ: PType) = of tyTuple: maxAlign = 1 sizeAccum = 0 - for i in countup(0, sonsLen(typ) - 1): + for i in 0 ..< sonsLen(typ): let child = typ.sons[i] computeSizeAlign(conf, child) if child.size < 0: diff --git a/compiler/suggest.nim b/compiler/suggest.nim index 16f9b4d65..6ae7c216f 100644 --- a/compiler/suggest.nim +++ b/compiler/suggest.nim @@ -275,7 +275,7 @@ template wholeSymTab(cond, section: untyped) = pm, c.inTypeContext > 0, scopeN)) proc suggestSymList(c: PContext, list, f: PNode; info: TLineInfo, outputs: var Suggestions) = - for i in countup(0, sonsLen(list) - 1): + for i in 0 ..< sonsLen(list): if list.sons[i].kind == nkSym: suggestField(c, list.sons[i].sym, f, info, outputs) #else: InternalError(list.info, "getSymFromList") @@ -283,12 +283,12 @@ proc suggestSymList(c: PContext, list, f: PNode; info: TLineInfo, outputs: var S proc suggestObject(c: PContext, n, f: PNode; info: TLineInfo, outputs: var Suggestions) = case n.kind of nkRecList: - for i in countup(0, sonsLen(n)-1): suggestObject(c, n.sons[i], f, info, outputs) + for i in 0 ..< sonsLen(n): suggestObject(c, n.sons[i], f, info, outputs) of nkRecCase: var L = sonsLen(n) if L > 0: suggestObject(c, n.sons[0], f, info, outputs) - for i in countup(1, L-1): suggestObject(c, lastSon(n.sons[i]), f, info, outputs) + for i in 1 ..< L: suggestObject(c, lastSon(n.sons[i]), f, info, outputs) of nkSym: suggestField(c, n.sym, f, info, outputs) else: discard diff --git a/compiler/syntaxes.nim b/compiler/syntaxes.nim index 60246b9bf..598a9bdc3 100644 --- a/compiler/syntaxes.nim +++ b/compiler/syntaxes.nim @@ -85,13 +85,13 @@ proc parsePipe(filename: AbsoluteFile, inputStream: PLLStream; cache: IdentCache llStreamClose(s) proc getFilter(ident: PIdent): TFilterKind = - for i in countup(low(TFilterKind), high(TFilterKind)): + for i in low(TFilterKind) .. high(TFilterKind): if cmpIgnoreStyle(ident.s, filterNames[i]) == 0: return i result = filtNone proc getParser(conf: ConfigRef; n: PNode; ident: PIdent): TParserKind = - for i in countup(low(TParserKind), high(TParserKind)): + for i in low(TParserKind) .. high(TParserKind): if cmpIgnoreStyle(ident.s, parserNames[i]) == 0: return i localError(conf, n.info, "unknown parser: " & ident.s) @@ -131,7 +131,7 @@ proc evalPipe(p: var TParsers, n: PNode, filename: AbsoluteFile, result = start if n.kind == nkEmpty: return if n.kind == nkInfix and n[0].kind == nkIdent and n[0].ident.s == "|": - for i in countup(1, 2): + for i in 1 .. 2: if n.sons[i].kind == nkInfix: result = evalPipe(p, n.sons[i], filename, result) else: diff --git a/compiler/transf.nim b/compiler/transf.nim index 25a8bc5dd..0e788b833 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -119,7 +119,7 @@ proc transform(c: PTransf, n: PNode): PTransNode proc transformSons(c: PTransf, n: PNode): PTransNode = result = newTransNode(n) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): result[i] = transform(c, n.sons[i]) proc newAsgnStmt(c: PTransf, kind: TNodeKind, le: PNode, ri: PTransNode): PTransNode = @@ -176,7 +176,7 @@ proc freshVar(c: PTransf; v: PSym): PNode = proc transformVarSection(c: PTransf, v: PNode): PTransNode = result = newTransNode(v) - for i in countup(0, sonsLen(v)-1): + for i in 0 ..< sonsLen(v): var it = v.sons[i] if it.kind == nkCommentStmt: result[i] = PTransNode(it) @@ -203,7 +203,7 @@ proc transformVarSection(c: PTransf, v: PNode): PTransNode = internalError(c.graph.config, it.info, "transformVarSection: not nkVarTuple") var L = sonsLen(it) var defs = newTransNode(it.kind, it.info, L) - for j in countup(0, L-3): + for j in 0 .. L-3: if it[j].kind == nkSym: let x = freshVar(c, it.sons[j].sym) idNodeTablePut(c.transCon.mapping, it.sons[j].sym, x) @@ -219,7 +219,7 @@ proc transformConstSection(c: PTransf, v: PNode): PTransNode = result = PTransNode(v) when false: result = newTransNode(v) - for i in countup(0, sonsLen(v)-1): + for i in 0 ..< sonsLen(v): var it = v.sons[i] if it.kind == nkCommentStmt: result[i] = PTransNode(it) @@ -236,7 +236,7 @@ proc hasContinue(n: PNode): bool = of nkEmpty..nkNilLit, nkForStmt, nkParForStmt, nkWhileStmt: discard of nkContinueStmt: result = true else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): if hasContinue(n.sons[i]): return true proc newLabel(c: PTransf, n: PNode): PSym = @@ -318,7 +318,7 @@ proc introduceNewLocalVars(c: PTransf, n: PNode): PTransNode = return PTransNode(n) else: result = newTransNode(n) - for i in countup(0, sonsLen(n)-1): + for i in 0 ..< sonsLen(n): result[i] = introduceNewLocalVars(c, n.sons[i]) proc transformAsgn(c: PTransf, n: PNode): PTransNode = @@ -375,7 +375,7 @@ proc transformYield(c: PTransf, n: PNode): PTransNode = c.transCon.forStmt.len != 3: e = skipConv(e) if e.kind in {nkPar, nkTupleConstr}: - for i in countup(0, sonsLen(e) - 1): + for i in 0 ..< sonsLen(e): var v = e.sons[i] if v.kind == nkExprColonExpr: v = v.sons[1] if c.transCon.forStmt[i].kind == nkVarTuple: @@ -390,7 +390,7 @@ proc transformYield(c: PTransf, n: PNode): PTransNode = else: # Unpack the tuple into the loop variables # XXX: BUG: what if `n` is an expression with side-effects? - for i in countup(0, sonsLen(c.transCon.forStmt) - 3): + for i in 0 .. sonsLen(c.transCon.forStmt) - 3: let lhs = c.transCon.forStmt.sons[i] let rhs = transform(c, newTupleAccess(c.graph, e, i)) add(result, asgnTo(lhs, rhs)) @@ -570,7 +570,7 @@ proc putArgInto(arg: PNode, formal: PType): TPutArgInto = result = paDirectMapping of nkPar, nkTupleConstr, nkCurly, nkBracket: result = paFastAsgn - for i in countup(0, sonsLen(arg) - 1): + for i in 0 ..< sonsLen(arg): if putArgInto(arg.sons[i], formal) != paDirectMapping: return result = paDirectMapping else: @@ -620,7 +620,7 @@ proc transformFor(c: PTransf, n: PNode): PTransNode = discard c.breakSyms.pop var v = newNodeI(nkVarSection, n.info) - for i in countup(0, length - 3): + for i in 0 .. length - 3: if n[i].kind == nkVarTuple: for j in 0 ..< sonsLen(n[i])-1: addVar(v, copyTree(n[i][j])) # declare new vars @@ -638,7 +638,7 @@ proc transformFor(c: PTransf, n: PNode): PTransNode = if iter.kind != skIterator: return result # generate access statements for the parameters (unless they are constant) pushTransCon(c, newC) - for i in countup(1, sonsLen(call) - 1): + for i in 1 ..< sonsLen(call): var arg = transform(c, call.sons[i]).PNode let ff = skipTypes(iter.typ, abstractInst) # can happen for 'nim check': @@ -736,7 +736,7 @@ proc flattenTreeAux(d, a: PNode, op: PSym) = let op2 = getMergeOp(a) if op2 != nil and (op2.id == op.id or op.magic != mNone and op2.magic == op.magic): - for i in countup(1, sonsLen(a)-1): flattenTreeAux(d, a.sons[i], op) + for i in 1 ..< sonsLen(a): flattenTreeAux(d, a.sons[i], op) else: addSon(d, copyTree(a)) diff --git a/compiler/trees.nim b/compiler/trees.nim index 55a3c619e..c1adee863 100644 --- a/compiler/trees.nim +++ b/compiler/trees.nim @@ -45,7 +45,7 @@ proc exprStructuralEquivalent*(a, b: PNode; strictSymEquality=false): bool = of nkEmpty, nkNilLit, nkType: result = true else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not exprStructuralEquivalent(a.sons[i], b.sons[i], strictSymEquality): return result = true @@ -69,7 +69,7 @@ proc sameTree*(a, b: PNode): bool = of nkEmpty, nkNilLit, nkType: result = true else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameTree(a.sons[i], b.sons[i]): return result = true @@ -101,7 +101,7 @@ proc isDeepConstExpr*(n: PNode): bool = if not isDeepConstExpr(n.sons[i]): return false if n.typ.isNil: result = true else: - let t = n.typ.skipTypes({tyGenericInst, tyDistinct, tyAlias, tySink}) + let t = n.typ.skipTypes({tyGenericInst, tyDistinct, tyAlias, tySink, tyOwned}) if t.kind in {tyRef, tyPtr}: return false if t.kind != tyObject or not isCaseObj(t.n): result = true @@ -121,7 +121,7 @@ proc whichPragma*(n: PNode): TSpecialWord = if key.kind == nkIdent: result = whichKeyword(key.ident) proc effectSpec*(n: PNode, effectType: TSpecialWord): PNode = - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): var it = n.sons[i] if it.kind == nkExprColonExpr and whichPragma(it) == effectType: result = it.sons[1] diff --git a/compiler/treetab.nim b/compiler/treetab.nim index f15974f61..7d654509c 100644 --- a/compiler/treetab.nim +++ b/compiler/treetab.nim @@ -31,7 +31,7 @@ proc hashTree(n: PNode): Hash = of nkStrLit..nkTripleStrLit: result = result !& hash(n.strVal) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = result !& hashTree(n.sons[i]) proc treesEquivalent(a, b: PNode): bool = @@ -47,7 +47,7 @@ proc treesEquivalent(a, b: PNode): bool = of nkStrLit..nkTripleStrLit: result = a.strVal == b.strVal else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not treesEquivalent(a.sons[i], b.sons[i]): return result = true if result: result = sameTypeOrNil(a.typ, b.typ) @@ -84,7 +84,7 @@ proc nodeTablePut*(t: var TNodeTable, key: PNode, val: int) = else: if mustRehash(len(t.data), t.counter): newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i].key != nil: nodeTableRawInsert(n, t.data[i].h, t.data[i].key, t.data[i].val) swap(t.data, n) @@ -101,7 +101,7 @@ proc nodeTableTestOrSet*(t: var TNodeTable, key: PNode, val: int): int = else: if mustRehash(len(t.data), t.counter): newSeq(n, len(t.data) * GrowthFactor) - for i in countup(0, high(t.data)): + for i in 0 .. high(t.data): if t.data[i].key != nil: nodeTableRawInsert(n, t.data[i].h, t.data[i].key, t.data[i].val) swap(t.data, n) diff --git a/compiler/types.nim b/compiler/types.nim index a1cd85d04..d56794d2d 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -102,7 +102,7 @@ proc getProcHeader*(conf: ConfigRef; sym: PSym; prefer: TPreferedDesc = preferNa if sym.kind in routineKinds: result.add '(' var n = sym.typ.n - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): let p = n.sons[i] if p.kind == nkSym: add(result, p.sym.name.s) @@ -123,6 +123,7 @@ proc elemType*(t: PType): PType = case t.kind of tyGenericInst, tyDistinct, tyAlias, tySink: result = elemType(lastSon(t)) of tyArray: result = t.sons[1] + of tyError: result = t else: result = t.lastSon assert(result != nil) @@ -149,7 +150,7 @@ proc iterOverNode(marker: var IntSet, n: PNode, iter: TTypeIter, # a leaf result = iterOverTypeAux(marker, n.typ, iter, closure) else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = iterOverNode(marker, n.sons[i], iter, closure) if result: return @@ -164,7 +165,7 @@ proc iterOverTypeAux(marker: var IntSet, t: PType, iter: TTypeIter, of tyGenericInst, tyGenericBody, tyAlias, tySink, tyInferred: result = iterOverTypeAux(marker, lastSon(t), iter, closure) else: - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result = iterOverTypeAux(marker, t.sons[i], iter, closure) if result: return if t.n != nil: result = iterOverNode(marker, t.n, iter, closure) @@ -181,14 +182,14 @@ proc searchTypeNodeForAux(n: PNode, p: TTypePredicate, result = false case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = searchTypeNodeForAux(n.sons[i], p, marker) if result: return of nkRecCase: assert(n.sons[0].kind == nkSym) result = searchTypeNodeForAux(n.sons[0], p, marker) if result: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = searchTypeNodeForAux(lastSon(n.sons[i]), p, marker) @@ -214,7 +215,7 @@ proc searchTypeForAux(t: PType, predicate: TTypePredicate, of tyGenericInst, tyDistinct, tyAlias, tySink: result = searchTypeForAux(lastSon(t), predicate, marker) of tyArray, tySet, tyTuple: - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result = searchTypeForAux(t.sons[i], predicate, marker) if result: return else: @@ -251,7 +252,7 @@ proc analyseObjectWithTypeFieldAux(t: PType, if t.n != nil: if searchTypeNodeForAux(t.n, isObjectWithTypeFieldPredicate, marker): return frEmbedded - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): var x = t.sons[i] if x != nil: x = x.skipTypes(skipPtrs) res = analyseObjectWithTypeFieldAux(x, marker) @@ -263,7 +264,7 @@ proc analyseObjectWithTypeFieldAux(t: PType, of tyGenericInst, tyDistinct, tyAlias, tySink: result = analyseObjectWithTypeFieldAux(lastSon(t), marker) of tyArray, tyTuple: - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): res = analyseObjectWithTypeFieldAux(t.sons[i], marker) if res != frNone: return frEmbedded @@ -313,7 +314,7 @@ proc canFormAcycleNode(marker: var IntSet, n: PNode, startId: int): bool = of nkNone..nkNilLit: discard else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = canFormAcycleNode(marker, n.sons[i], startId) if result: return @@ -324,7 +325,7 @@ proc canFormAcycleAux(marker: var IntSet, typ: PType, startId: int): bool = case t.kind of tyTuple, tyObject, tyRef, tySequence, tyArray, tyOpenArray, tyVarargs: if not containsOrIncl(marker, t.id): - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result = canFormAcycleAux(marker, t.sons[i], startId) if result: return if t.n != nil: result = canFormAcycleNode(marker, t.n, startId) @@ -360,7 +361,7 @@ proc mutateNode(marker: var IntSet, n: PNode, iter: TTypeMutator, # a leaf discard else: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): addSon(result, mutateNode(marker, n.sons[i], iter, closure)) proc mutateTypeAux(marker: var IntSet, t: PType, iter: TTypeMutator, @@ -369,7 +370,7 @@ proc mutateTypeAux(marker: var IntSet, t: PType, iter: TTypeMutator, if t == nil: return result = iter(t, closure) if not containsOrIncl(marker, t.id): - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result.sons[i] = mutateTypeAux(marker, result.sons[i], iter, closure) if t.n != nil: result.n = mutateNode(marker, t.n, iter, closure) assert(result != nil) @@ -458,13 +459,13 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = result = "int literal(" & $t.n.intVal & ")" of tyGenericInst, tyGenericInvocation: result = typeToString(t.sons[0]) & '[' - for i in countup(1, sonsLen(t)-1-ord(t.kind != tyGenericInvocation)): + for i in 1 ..< sonsLen(t)-ord(t.kind != tyGenericInvocation): if i > 1: add(result, ", ") add(result, typeToString(t.sons[i], preferGenericArg)) add(result, ']') of tyGenericBody: result = typeToString(t.lastSon) & '[' - for i in countup(0, sonsLen(t)-2): + for i in 0 .. sonsLen(t)-2: if i > 0: add(result, ", ") add(result, typeToString(t.sons[i], preferTypeName)) add(result, ']') @@ -505,7 +506,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = of tyUserTypeClassInst: let body = t.base result = body.sym.name.s & "[" - for i in countup(1, sonsLen(t) - 2): + for i in 1 .. sonsLen(t) - 2: if i > 1: add(result, ", ") add(result, typeToString(t.sons[i])) result.add "]" @@ -556,7 +557,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = if t.n != nil: result = "tuple[" assert(sonsLen(t.n) == sonsLen(t)) - for i in countup(0, sonsLen(t.n) - 1): + for i in 0 ..< sonsLen(t.n): assert(t.n.sons[i].kind == nkSym) add(result, t.n.sons[i].sym.name.s & ": " & typeToString(t.sons[i])) if i < sonsLen(t.n) - 1: add(result, ", ") @@ -566,7 +567,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = else: if prefer == preferTypeName: result = "(" else: result = "tuple of (" - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): add(result, typeToString(t.sons[i])) if i < sonsLen(t) - 1: add(result, ", ") add(result, ')') @@ -575,7 +576,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = if t.len >= 2: setLen(result, result.len-1) result.add '[' - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): add(result, typeToString(t.sons[i])) if i < sonsLen(t) - 1: add(result, ", ") result.add ']' @@ -599,7 +600,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string = "proc " if tfUnresolved in t.flags: result.add "[*missing parameters*]" result.add "(" - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): if t.n != nil and i < t.n.len and t.n[i].kind == nkSym: add(result, t.n[i].sym.name.s) add(result, ": ") @@ -842,7 +843,7 @@ proc equalParams(a, b: PNode): TParamsEquality = if length != sonsLen(b): result = paramsNotEqual else: - for i in countup(1, length - 1): + for i in 1 ..< length: var m = a.sons[i].sym var n = b.sons[i].sym assert((m.kind == skParam) and (n.kind == skParam)) @@ -871,7 +872,7 @@ proc sameTuple(a, b: PType, c: var TSameTypeClosure): bool = # complicates the matter a bit. if sonsLen(a) == sonsLen(b): result = true - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): var x = a.sons[i] var y = b.sons[i] if IgnoreTupleFields in c.flags: @@ -881,7 +882,7 @@ proc sameTuple(a, b: PType, c: var TSameTypeClosure): bool = result = sameTypeAux(x, y, c) if not result: return if a.n != nil and b.n != nil and IgnoreTupleFields notin c.flags: - for i in countup(0, sonsLen(a.n) - 1): + for i in 0 ..< sonsLen(a.n): # check field names: if a.n.sons[i].kind == nkSym and b.n.sons[i].kind == nkSym: var x = a.n.sons[i].sym @@ -945,14 +946,14 @@ proc sameObjectTree(a, b: PNode, c: var TSameTypeClosure): bool = of nkEmpty, nkNilLit, nkType: result = true else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameObjectTree(a.sons[i], b.sons[i], c): return result = true proc sameObjectStructures(a, b: PType, c: var TSameTypeClosure): bool = # check base types: if sonsLen(a) != sonsLen(b): return - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameTypeOrNilAux(a.sons[i], b.sons[i], c): return if not sameObjectTree(a.n, b.n, c): return result = true @@ -960,7 +961,7 @@ proc sameObjectStructures(a, b: PType, c: var TSameTypeClosure): bool = proc sameChildrenAux(a, b: PType, c: var TSameTypeClosure): bool = if sonsLen(a) != sonsLen(b): return false result = true - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): result = sameTypeOrNilAux(a.sons[i], b.sons[i], c) if not result: return @@ -1167,7 +1168,7 @@ proc typeAllowedNode(marker: var IntSet, n: PNode, kind: TSymKind, else: if n.kind == nkRecCase and kind in {skProc, skFunc, skConst}: return n[0].typ - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): let it = n.sons[i] result = typeAllowedNode(marker, it, kind, flags) if result != nil: break @@ -1198,15 +1199,15 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, case t2.kind of tyVar, tyLent: if taHeap notin flags: result = t2 # ``var var`` is illegal on the heap - of tyOpenArray: + of tyOpenArray, tyUncheckedArray: if kind != skParam: result = t - else: result = typeAllowedAux(marker, t2, kind, flags) + else: result = typeAllowedAux(marker, t2.sons[0], skParam, flags) else: if kind notin {skParam, skResult}: result = t else: result = typeAllowedAux(marker, t2, kind, flags) of tyProc: if kind == skConst and t.callConv == ccClosure: return t - for i in countup(1, sonsLen(t) - 1): + for i in 1 ..< sonsLen(t): result = typeAllowedAux(marker, t.sons[i], skParam, flags) if result != nil: break if result.isNil and t.sons[0] != nil: @@ -1234,14 +1235,21 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, result = nil of tyOrdinal: if kind != skParam: result = t - of tyGenericInst, tyDistinct, tyAlias, tyInferred, tyUncheckedArray: + of tyGenericInst, tyDistinct, tyAlias, tyInferred: result = typeAllowedAux(marker, lastSon(t), kind, flags) of tyRange: if skipTypes(t.sons[0], abstractInst-{tyTypeDesc}).kind notin {tyChar, tyEnum, tyInt..tyFloat128, tyUInt8..tyUInt32}: result = t of tyOpenArray, tyVarargs, tySink: - if kind != skParam: result = t - else: result = typeAllowedAux(marker, t.sons[0], skVar, flags) + if kind != skParam: + result = t + else: + result = typeAllowedAux(marker, t.sons[0], skVar, flags) + of tyUncheckedArray: + if kind != skParam and taHeap notin flags: + result = t + else: + result = typeAllowedAux(marker, lastSon(t), kind, flags) of tySequence, tyOpt: if t.sons[0].kind != tyEmpty: result = typeAllowedAux(marker, t.sons[0], skVar, flags+{taHeap}) @@ -1258,14 +1266,14 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, of tyPtr: result = typeAllowedAux(marker, t.lastSon, skVar, flags+{taHeap}) of tySet: - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result = typeAllowedAux(marker, t.sons[i], kind, flags) if result != nil: break of tyObject, tyTuple: if kind in {skProc, skFunc, skConst} and t.kind == tyObject and t.sons[0] != nil: return t let flags = flags+{taField} - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): result = typeAllowedAux(marker, t.sons[i], kind, flags) if result != nil: break if result.isNil and t.n != nil: @@ -1516,11 +1524,12 @@ proc typeMismatch*(conf: ConfigRef; info: TLineInfo, formal, actual: PType) = localError(conf, info, msg) proc isTupleRecursive(t: PType, cycleDetector: var IntSet): bool = - if t == nil: return + if t == nil: + return false + if cycleDetector.containsOrIncl(t.id): + return true case t.kind: of tyTuple: - if cycleDetector.containsOrIncl(t.id): - return true var cycleDetectorCopy: IntSet for i in 0..<t.len: assign(cycleDetectorCopy, cycleDetector) @@ -1529,7 +1538,7 @@ proc isTupleRecursive(t: PType, cycleDetector: var IntSet): bool = of tyAlias, tyRef, tyPtr, tyGenericInst, tyVar, tyLent, tySink, tyArray, tyUncheckedArray, tySequence: return isTupleRecursive(t.lastSon, cycleDetector) else: - discard + return false proc isTupleRecursive*(t: PType): bool = var cycleDetector = initIntSet() diff --git a/compiler/vm.nim b/compiler/vm.nim index d8694d721..6fc2626f7 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -200,7 +200,7 @@ proc copyValue(src: PNode): PNode = of nkStrLit..nkTripleStrLit: result.strVal = src.strVal else: newSeq(result.sons, sonsLen(src)) - for i in countup(0, sonsLen(src) - 1): + for i in 0 ..< sonsLen(src): result.sons[i] = copyValue(src.sons[i]) proc asgnComplex(x: var TFullReg, y: TFullReg) = @@ -778,7 +778,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = addSon(b, regs[rb].regToNode) var r = diffSets(c.config, regs[ra].node, b) discardSons(regs[ra].node) - for i in countup(0, sonsLen(r) - 1): addSon(regs[ra].node, r.sons[i]) + for i in 0 ..< sonsLen(r): addSon(regs[ra].node, r.sons[i]) of opcCard: decodeB(rkInt) regs[ra].intVal = nimsets.cardSet(c.config, regs[rb].node) @@ -1154,7 +1154,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = # we know the next instruction is a 'fjmp': let branch = c.constants[instr.regBx-wordExcess] var cond = false - for j in countup(0, sonsLen(branch) - 2): + for j in 0 .. sonsLen(branch) - 2: if overlap(regs[ra].regToNode, branch.sons[j]): cond = true break @@ -1756,7 +1756,7 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = of opcNDel: decodeBC(rkNode) let bb = regs[rb].intVal.int - for i in countup(0, regs[rc].intVal.int-1): + for i in 0 ..< regs[rc].intVal.int: delSon(regs[ra].node, bb) of opcGenSym: decodeBC(rkNode) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 3a46af08a..5bb44785a 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -366,7 +366,7 @@ proc genIf(c: PCtx, n: PNode; dest: var TDest) = # Lend: if dest < 0 and not isEmptyType(n.typ): dest = getTemp(c, n.typ) var endings: seq[TPosition] = @[] - for i in countup(0, len(n) - 1): + for i in 0 ..< len(n): var it = n.sons[i] if it.len == 2: withTemp(tmp, it.sons[0].typ): @@ -436,7 +436,7 @@ proc sameConstant*(a, b: PNode): bool = of nkEmpty: result = true else: if sonsLen(a) == sonsLen(b): - for i in countup(0, sonsLen(a) - 1): + for i in 0 ..< sonsLen(a): if not sameConstant(a.sons[i], b.sons[i]): return result = true @@ -510,7 +510,7 @@ proc genTry(c: PCtx; n: PNode; dest: var TDest) = var blen = len(it) # first opcExcept contains the end label of the 'except' block: let endExcept = c.xjmp(it, opcExcept, 0) - for j in countup(0, blen - 2): + for j in 0 .. blen - 2: assert(it.sons[j].kind == nkType) let typ = it.sons[j].typ.skipTypes(abstractPtrs-{tyTypeDesc}) c.gABx(it, opcExcept, 0, c.genType(typ)) @@ -931,6 +931,21 @@ proc ldNullOpcode(t: PType): TOpcode = assert t != nil if fitsRegister(t): opcLdNullReg else: opcLdNull +proc whichAsgnOpc(n: PNode): TOpcode = + case n.typ.skipTypes(abstractRange+{tyOwned}-{tyTypeDesc}).kind + of tyBool, tyChar, tyEnum, tyOrdinal, tyInt..tyInt64, tyUInt..tyUInt64: + opcAsgnInt + of tyString, tyCString: + opcAsgnStr + of tyFloat..tyFloat128: + opcAsgnFloat + of tyRef, tyNil, tyVar, tyLent, tyPtr: + opcAsgnRef + else: + opcAsgnComplex + +proc whichAsgnOpc(n: PNode; opc: TOpcode): TOpcode = opc + proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) = case m of mAnd: c.genAndOr(n, opcFJmp, dest) @@ -1330,6 +1345,17 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) = of mRunnableExamples: discard "just ignore any call to runnableExamples" of mDestroy: discard "ignore calls to the default destructor" + of mMove: + let arg = n[1] + let a = c.genx(arg) + assert dest >= 0 + if dest < 0: dest = c.getTemp(arg.typ) + gABC(c, arg, whichAsgnOpc(arg), dest, a, 1) + # XXX use ldNullOpcode() here? + c.gABx(n, opcLdNull, a, c.genType(arg.typ)) + c.gABx(n, opcNodeToReg, a, a) + c.genAsgnPatch(arg, a) + c.freeTemp(a) else: # mGCref, mGCunref, globalError(c.config, n.info, "cannot generate code for: " & $m) @@ -1423,21 +1449,6 @@ proc genDeref(c: PCtx, n: PNode, dest: var TDest, flags: TGenFlags) = if {gfNodeAddr, gfNode} * flags == {} and fitsRegister(n.typ): c.gABC(n, opcNodeToReg, dest, dest) -proc whichAsgnOpc(n: PNode): TOpcode = - case n.typ.skipTypes(abstractRange+{tyOwned}-{tyTypeDesc}).kind - of tyBool, tyChar, tyEnum, tyOrdinal, tyInt..tyInt64, tyUInt..tyUInt64: - opcAsgnInt - of tyString, tyCString: - opcAsgnStr - of tyFloat..tyFloat128: - opcAsgnFloat - of tyRef, tyNil, tyVar, tyLent, tyPtr: - opcAsgnRef - else: - opcAsgnComplex - -proc whichAsgnOpc(n: PNode; opc: TOpcode): TOpcode = opc - proc genAsgn(c: PCtx; dest: TDest; ri: PNode; requiresCopy: bool) = let tmp = c.genx(ri) assert dest >= 0 @@ -1728,10 +1739,10 @@ proc genArrAccess(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags) = proc getNullValueAux(obj: PNode, result: PNode; conf: ConfigRef) = case obj.kind of nkRecList: - for i in countup(0, sonsLen(obj) - 1): getNullValueAux(obj.sons[i], result, conf) + for i in 0 ..< sonsLen(obj): getNullValueAux(obj.sons[i], result, conf) of nkRecCase: getNullValueAux(obj.sons[0], result, conf) - for i in countup(1, sonsLen(obj) - 1): + for i in 1 ..< sonsLen(obj): getNullValueAux(lastSon(obj.sons[i]), result, conf) of nkSym: let field = newNodeI(nkExprColonExpr, result.info) @@ -1773,11 +1784,11 @@ proc getNullValue(typ: PType, info: TLineInfo; conf: ConfigRef): PNode = getNullValueAux(t.n, result, conf) of tyArray: result = newNodeIT(nkBracket, info, t) - for i in countup(0, int(lengthOrd(conf, t)) - 1): + for i in 0 ..< int(lengthOrd(conf, t)): addSon(result, getNullValue(elemType(t), info, conf)) of tyTuple: result = newNodeIT(nkTupleConstr, info, t) - for i in countup(0, sonsLen(t) - 1): + for i in 0 ..< sonsLen(t): addSon(result, getNullValue(t.sons[i], info, conf)) of tySet: result = newNodeIT(nkCurly, info, t) diff --git a/compiler/vmmarshal.nim b/compiler/vmmarshal.nim index 149d2e08f..2a81cb14d 100644 --- a/compiler/vmmarshal.nim +++ b/compiler/vmmarshal.nim @@ -18,13 +18,13 @@ proc ptrToInt(x: PNode): int {.inline.} = proc getField(n: PNode; position: int): PSym = case n.kind of nkRecList: - for i in countup(0, sonsLen(n) - 1): + for i in 0 ..< sonsLen(n): result = getField(n.sons[i], position) if result != nil: return of nkRecCase: result = getField(n.sons[0], position) if result != nil: return - for i in countup(1, sonsLen(n) - 1): + for i in 1 ..< sonsLen(n): case n.sons[i].kind of nkOfBranch, nkElse: result = getField(lastSon(n.sons[i]), position) @@ -39,7 +39,7 @@ proc storeAny(s: var string; t: PType; a: PNode; stored: var IntSet; conf: Confi proc storeObj(s: var string; typ: PType; x: PNode; stored: var IntSet; conf: ConfigRef) = assert x.kind == nkObjConstr let start = 1 - for i in countup(start, sonsLen(x) - 1): + for i in start ..< sonsLen(x): if i > start: s.add(", ") var it = x.sons[i] if it.kind == nkExprColonExpr: diff --git a/compiler/wordrecg.nim b/compiler/wordrecg.nim index 4da19779b..ef59fc979 100644 --- a/compiler/wordrecg.nim +++ b/compiler/wordrecg.nim @@ -180,7 +180,7 @@ const ] proc findStr*(a: openArray[string], s: string): int = - for i in countup(low(a), high(a)): + for i in low(a) .. high(a): if cmpIgnoreStyle(a[i], s) == 0: return i result = - 1 |