From 0f743e01833290e2995756fbd459728b12d833be Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 16 Jan 2011 16:22:23 +0100 Subject: explicit indices in array literals --- rod/msgs.nim | 2 ++ rod/semexprs.nim | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'rod') diff --git a/rod/msgs.nim b/rod/msgs.nim index d6fde38b4..e34631c90 100755 --- a/rod/msgs.nim +++ b/rod/msgs.nim @@ -94,6 +94,7 @@ type errXCannotBeInParamDecl, errPragmaOnlyInHeaderOfProc, errImplOfXNotAllowed, errImplOfXexpected, errNoSymbolToBorrowFromFound, errDiscardValue, errInvalidDiscard, errIllegalConvFromXtoY, errCannotBindXTwice, + errInvalidOrderInArrayConstructor, errInvalidOrderInEnumX, errEnumXHasWholes, errExceptExpected, errInvalidTry, errOptionExpected, errXisNoLabel, errNotAllCasesCovered, errUnkownSubstitionVar, errComplexStmtRequiresInd, errXisNotCallable, @@ -214,6 +215,7 @@ const "value returned by statement has to be discarded", "statement returns no value that can be discarded", "conversion from $1 to $2 is invalid", "cannot bind parameter \'$1\' twice", + "invalid order in array constructor", "invalid order in enum \'$1\'", "enum \'$1\' has wholes", "\'except\' or \'finally\' expected", "after catch all \'except\' or \'finally\' no section may follow", diff --git a/rod/semexprs.nim b/rod/semexprs.nim index 10ed6567e..e6cf097e5 100755 --- a/rod/semexprs.nim +++ b/rod/semexprs.nim @@ -260,11 +260,29 @@ proc semArrayConstr(c: PContext, n: PNode): PNode = if sonsLen(n) == 0: addSon(result.typ, newTypeS(tyEmpty, c)) # needs an empty basetype! else: - addSon(result, semExprWithType(c, n.sons[0])) + var x = n.sons[0] + var lastIndex: biggestInt = 0 + var indexType = getSysType(tyInt) + if x.kind == nkExprColonExpr: + var idx = semConstExpr(c, x.sons[0]) + lastIndex = getOrdValue(idx) + indexType = idx.typ + x = x.sons[1] + + addSon(result, semExprWithType(c, x)) var typ = skipTypes(result.sons[0].typ, {tyGenericInst, tyVar, tyOrdinal}) for i in countup(1, sonsLen(n) - 1): - n.sons[i] = semExprWithType(c, n.sons[i]) + x = n.sons[i] + if x.kind == nkExprColonExpr: + var idx = semConstExpr(c, x.sons[0]) + idx = fitNode(c, indexType, idx) + if lastIndex+1 != getOrdValue(idx): + liMessage(x.info, errInvalidOrderInArrayConstructor) + x = x.sons[1] + + n.sons[i] = semExprWithType(c, x) addSon(result, fitNode(c, typ, n.sons[i])) + inc(lastIndex) addSon(result.typ, typ) result.typ.sons[0] = makeRangeType(c, 0, sonsLen(result) - 1, n.info) -- cgit 1.4.1-2-gfad0 t?h=devel&id=ac8f6c57a1eb915e9b25ea52bf868c8b89b30c04'>plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13