diff options
author | Zahary Karadjov <zahary@gmail.com> | 2014-03-16 18:34:37 +0200 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2014-03-16 20:42:49 +0200 |
commit | 49b0440c47b1f22bf2b84083b0c2b79fb60fdfd5 (patch) | |
tree | cc3e9612054ebcad226d0f7bffc3237d62d30005 | |
parent | f0953db3ba59f2e23df2fb7932c672f5020db5fb (diff) | |
download | Nim-49b0440c47b1f22bf2b84083b0c2b79fb60fdfd5.tar.gz |
make some tests green
-rw-r--r-- | compiler/lookups.nim | 5 | ||||
-rw-r--r-- | compiler/semexprs.nim | 10 | ||||
-rw-r--r-- | compiler/seminst.nim | 16 | ||||
-rw-r--r-- | compiler/semtypes.nim | 7 | ||||
-rw-r--r-- | compiler/sigmatch.nim | 9 | ||||
-rw-r--r-- | compiler/vmgen.nim | 2 | ||||
-rw-r--r-- | tests/bind/tinvalidbindtypedesc.nim (renamed from tests/bind/tbindtypedesc.nim) | 0 | ||||
-rw-r--r-- | tests/metatype/tstaticparams.nim | 4 | ||||
-rw-r--r-- | tests/metatype/tusertypeclasses.nim | 6 | ||||
-rw-r--r-- | tests/stdlib/tpegs.nim | 2 | ||||
-rw-r--r-- | tests/testament/tester.nim | 3 | ||||
-rw-r--r-- | tests/vm/twrongconst.nim | 7 | ||||
-rw-r--r-- | tests/vm/twrongwhen.nim | 4 |
13 files changed, 45 insertions, 30 deletions
diff --git a/compiler/lookups.nim b/compiler/lookups.nim index 8239f2a47..60125177c 100644 --- a/compiler/lookups.nim +++ b/compiler/lookups.nim @@ -127,7 +127,10 @@ proc ensureNoMissingOrUnusedSymbols(scope: PScope) = elif {sfUsed, sfExported} * s.flags == {} and optHints in s.options: # BUGFIX: check options in s! if s.kind notin {skForVar, skParam, skMethod, skUnknown, skGenericParam}: - message(s.info, hintXDeclaredButNotUsed, getSymRepr(s)) + # XXX: implicit type params are currently skTypes + # maybe they can be made skGenericParam as well. + if s.typ != nil and tfImplicitTypeParam notin s.typ.flags: + message(s.info, hintXDeclaredButNotUsed, getSymRepr(s)) s = nextIter(it, scope.symbols) proc wrongRedefinition*(info: TLineInfo, s: string) = diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 2c7408047..7e141cb24 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -325,8 +325,13 @@ proc isOpImpl(c: PContext, n: PNode): PNode = tfIterator notin t.flags)) else: var t2 = n[2].typ.skipTypes({tyTypeDesc}) + # XXX: liftParamType started to perform addDecl + # we could do that instead in semTypeNode by snooping for added + # gnrc. params, then it won't be necessary to open a new scope here + openScope(c) let lifted = liftParamType(c, skType, newNodeI(nkArgList, n.info), t2, ":anon", n.info) + closeScope(c) if lifted != nil: t2 = lifted var m: TCandidate initCandidate(c, m, t2) @@ -1257,8 +1262,9 @@ proc semProcBody(c: PContext, n: PNode): PNode = result = semAsgn(c, a) else: discardCheck(c, result) - - if c.p.resultSym != nil and c.p.resultSym.typ.isMetaType: + + if c.p.owner.kind notin {skMacro, skTemplate} and + c.p.resultSym != nil and c.p.resultSym.typ.isMetaType: localError(c.p.resultSym.info, errCannotInferReturnType) closeScope(c) diff --git a/compiler/seminst.nim b/compiler/seminst.nim index 3d3227e4e..a5149a842 100644 --- a/compiler/seminst.nim +++ b/compiler/seminst.nim @@ -117,12 +117,9 @@ proc fixupInstantiatedSymbols(c: PContext, s: PSym) = var oldPrc = c.generics[i].inst.sym pushInfoContext(oldPrc.info) openScope(c) - pushProcCon(c, oldPrc) - addProcDecls(c, oldPrc) var n = oldPrc.ast n.sons[bodyPos] = copyTree(s.getBody) instantiateBody(c, n, oldPrc) - popProcCon(c) closeScope(c) popInfoContext() @@ -164,10 +161,11 @@ proc instantiateProcType(c: PContext, pt: TIdTable, # at this point semtypinst have to become part of sem, because it # will need to use openScope, addDecl, etc # + addDecl(c, prc) + pushInfoContext(info) var cl = initTypeVars(c, pt, info) var result = instCopyType(cl, prc.typ) - addDecl(c, prc) let originalParams = result.n result.n = originalParams.shallowCopy @@ -175,10 +173,14 @@ proc instantiateProcType(c: PContext, pt: TIdTable, result.sons[i] = replaceTypeVarsT(cl, result.sons[i]) propagateToOwner(result, result.sons[i]) let param = replaceTypeVarsN(cl, originalParams[i]) - internalAssert param.kind == nkSym result.n.sons[i] = param - addDecl(c, param.sym) - + if param.kind == nkSym: + # XXX: this won't be true for void params + # implement pass-through of void params and + # the "sort by distance to point" container + param.sym.owner = prc + addDecl(c, param.sym) + result.sons[0] = replaceTypeVarsT(cl, result.sons[0]) result.n.sons[0] = originalParams[0].copyTree diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 4e97a6744..06fcd74b4 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -220,7 +220,7 @@ proc semArray(c: PContext, n: PNode, prev: PType): PType = else: let e = semExprWithType(c, n.sons[1], {efDetermineType}) if e.typ.kind == tyFromExpr: - indx = e.typ + indx = makeRangeWithStaticExpr(c, e.typ.n) elif e.kind in {nkIntLit..nkUInt64Lit}: indx = makeRangeType(c, 0, e.intVal-1, n.info, e.typ) elif e.kind == nkSym and e.typ.kind == tyStatic: @@ -783,7 +783,7 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode, result = paramType result.lastSon.shouldHaveMeta - let liftBody = liftingWalk(paramType.lastSon) + let liftBody = liftingWalk(paramType.lastSon, true) if liftBody != nil: result = liftBody result.shouldHaveMeta @@ -795,7 +795,7 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode, let expanded = instGenericContainer(c, info, paramType, allowMetaTypes = true) - result = liftingWalk(expanded) + result = liftingWalk(expanded, true) of tyUserTypeClass, tyBuiltInTypeClass, tyAnd, tyOr, tyNot: result = addImplicitGeneric(copyType(paramType, getCurrOwner(), true)) @@ -964,6 +964,7 @@ proc semGeneric(c: PContext, n: PNode, s: PSym, prev: PType): PType = elif s.typ.kind != tyGenericBody: #we likely got code of the form TypeA[TypeB] where TypeA is #not generic. + debug s.typ localError(n.info, errNoGenericParamsAllowedForX, s.name.s) return newOrPrevType(tyError, prev, c) else: diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index b87d27cb4..662268380 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -522,8 +522,9 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = template bindingRet(res) = when res == isGeneric: - let bound = aOrig.skipTypes({tyRange}).skipIntLit - put(c.bindings, f, bound) + if doBind: + let bound = aOrig.skipTypes({tyRange}).skipIntLit + if doBind: put(c.bindings, f, bound) return res template considerPreviousT(body: stmt) {.immediate.} = @@ -869,7 +870,9 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation = # any value" and what we need is "match any type", which can be encoded # by a tyTypeDesc params. Unfortunately, this requires more substantial # changes in semtypinst and elsewhere. - if a.kind == tyTypeDesc or tfWildcard in a.flags: + if tfWildcard in a.flags: + result = isGeneric + elif a.kind == tyTypeDesc: if f.sonsLen == 0: result = isGeneric else: diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 0fc71189d..d3eda5db3 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1569,7 +1569,7 @@ proc genProc(c: PCtx; s: PSym): int = c.gABC(body, opcEof, eofInstr.regA) c.optimizeJumps(result) s.offset = c.prc.maxSlots - #if s.name.s == "xmlConstructor": + #if s.name.s == "foo": # echo renderTree(body) # c.echoCode(result) c.prc = oldPrc diff --git a/tests/bind/tbindtypedesc.nim b/tests/bind/tinvalidbindtypedesc.nim index d6fbae537..d6fbae537 100644 --- a/tests/bind/tbindtypedesc.nim +++ b/tests/bind/tinvalidbindtypedesc.nim diff --git a/tests/metatype/tstaticparams.nim b/tests/metatype/tstaticparams.nim index d14de7d65..6d7c569e0 100644 --- a/tests/metatype/tstaticparams.nim +++ b/tests/metatype/tstaticparams.nim @@ -54,5 +54,5 @@ echo getRows(m) type TTest[T: static[int], U: static[int]] = array[0..T*U, int] type TTestSub[N: static[int]] = TTest[1, N] -var x: TTestSub[2] -echo x.high +var z: TTestSub[2] +echo z.high diff --git a/tests/metatype/tusertypeclasses.nim b/tests/metatype/tusertypeclasses.nim index eb6597e4d..a5d575dbf 100644 --- a/tests/metatype/tusertypeclasses.nim +++ b/tests/metatype/tusertypeclasses.nim @@ -26,7 +26,7 @@ foo 10 foo "test" foo(@[TObj(x: 10), TObj(x: 20)]) -proc intval(x: int) = discard +proc intval(x: int): int = 10 # check real and virtual fields type @@ -34,8 +34,8 @@ type T.x y(T) intval T.y - let y = intval(T.y) - + let z = intval(T.y) + proc y(x: TObj): int = 10 proc testFoo(x: TFoo) = discard diff --git a/tests/stdlib/tpegs.nim b/tests/stdlib/tpegs.nim index 7775091a1..6e488bab4 100644 --- a/tests/stdlib/tpegs.nim +++ b/tests/stdlib/tpegs.nim @@ -72,7 +72,7 @@ type rule: TNode ## the rule that the symbol refers to TNode {.final, shallow.} = object case kind: TPegKind - of pkEmpty..pkWhitespace: discard + of pkEmpty..pkWhitespace: nil of pkTerminal, pkTerminalIgnoreCase, pkTerminalIgnoreStyle: term: string of pkChar, pkGreedyRepChar: ch: char of pkCharChoice, pkGreedyRepSet: charChoice: ref set[char] diff --git a/tests/testament/tester.nim b/tests/testament/tester.nim index fac97cf2a..d32269ad6 100644 --- a/tests/testament/tester.nim +++ b/tests/testament/tester.nim @@ -109,6 +109,7 @@ proc addResult(r: var TResults, test: TTest, expected = expected, given = given) r.data.addf("$#\t$#\t$#\t$#", name, expected, given, $success) + echo " [", $success, "]" proc cmpMsgs(r: var TResults, expected, given: TSpec, test: TTest) = if strip(expected.msg) notin strip(given.msg): @@ -146,7 +147,7 @@ proc testSpec(r: var TResults, test: TTest) = # major entry point for a single test let tname = test.name.addFileExt(".nim") inc(r.total) - echo extractFilename(tname) + stdout.write extractFilename(tname) var expected = parseSpec(tname) if expected.err == reIgnored: r.addResult(test, "", "", reIgnored) diff --git a/tests/vm/twrongconst.nim b/tests/vm/twrongconst.nim index e5b8a15bd..5c0c80f9f 100644 --- a/tests/vm/twrongconst.nim +++ b/tests/vm/twrongconst.nim @@ -1,10 +1,9 @@ discard """ - output: "Error: cannot evaluate at compile time: x" - line: 10 + errormsg: "cannot evaluate at compile time: x" + line: 9 """ -var x: array[100, char] +var x: array[100, char] template Foo : expr = x[42] - const myConst = foo diff --git a/tests/vm/twrongwhen.nim b/tests/vm/twrongwhen.nim index 085bb6fb6..d67e42883 100644 --- a/tests/vm/twrongwhen.nim +++ b/tests/vm/twrongwhen.nim @@ -1,9 +1,9 @@ discard """ - output: "Error: cannot evaluate at compile time: x" + errormsg: "cannot evaluate at compile time: x" line: 7 """ -proc bla(x:int) = +proc bla(x:int) = when x == 0: echo "oops" else: |