diff options
-rw-r--r-- | .travis.yml | 4 | ||||
-rw-r--r-- | compiler/cgen.nim | 2 | ||||
-rw-r--r-- | compiler/docgen.nim | 10 | ||||
-rw-r--r-- | compiler/installer.ini | 1 | ||||
-rw-r--r-- | compiler/semexprs.nim | 2 | ||||
-rw-r--r-- | compiler/vm.nim | 10 | ||||
-rw-r--r-- | compiler/vmgen.nim | 3 | ||||
-rw-r--r-- | koch.nim | 63 | ||||
-rw-r--r-- | lib/pure/strscans.nim | 4 | ||||
-rw-r--r-- | lib/system.nim | 10 | ||||
-rw-r--r-- | tests/ccgbugs/tcodegenbug1.nim | 35 | ||||
-rw-r--r-- | tests/compilerapi/tcompilerapi.nim | 9 | ||||
-rw-r--r-- | tests/newconfig/tfoo.nims | 22 | ||||
-rw-r--r-- | tests/openarray/t8259.nim | 7 | ||||
-rw-r--r-- | tests/stdlib/t8925.nim | 16 | ||||
-rw-r--r-- | tests/vm/t2574.nim | 14 | ||||
-rw-r--r-- | tests/vm/t4952.nim | 17 | ||||
-rw-r--r-- | tools/kochdocs.nim | 2 |
18 files changed, 179 insertions, 52 deletions
diff --git a/.travis.yml b/.travis.yml index 007fef9fe..b3b4834b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,7 +43,9 @@ script: #- nimble install jester@#head -y #- nimble install niminst - nim c --taintMode:on -d:nimCoroutines tests/testament/tester - - tests/testament/tester --pedantic all -d:nimCoroutines + # Do not run the tests on OSX as OSX does 'testinstall' which *also* runs all the tests! + - if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then tests/testament/tester --pedantic all -d:nimCoroutines; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./koch testinstall; fi - nim c -o:bin/nimpretty nimpretty/nimpretty.nim - nim c -r nimpretty/tester.nim - ./koch docs diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 2db92bc21..3040f98da 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -707,7 +707,7 @@ proc containsResult(n: PNode): bool = for i in 0..<n.safeLen: if containsResult(n[i]): return true -const harmless = {nkConstSection, nkTypeSection, nkEmpty, nkCommentStmt} + +const harmless = {nkConstSection, nkTypeSection, nkEmpty, nkCommentStmt, nkTemplateDef, nkMacroDef} + declarativeDefs proc easyResultAsgn(n: PNode): PNode = diff --git a/compiler/docgen.nim b/compiler/docgen.nim index e7920ad06..83dd5de2a 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -976,10 +976,12 @@ proc commandRstAux(cache: IdentCache, conf: ConfigRef; # Nim's convention: every path is relative to the file it was written in: outp = splitFile(d.filename).dir.AbsoluteDir / RelativeFile(filename) writeFile(outp, content) - let cmd = cmd % quoteShell(outp) - rawMessage(conf, hintExecuting, cmd) - if execShellCmd(cmd) != status: - rawMessage(conf, errGenerated, "executing of external program failed: " & cmd) + let c = if cmd.startsWith("nim "): os.getAppFilename() & cmd.substr(3) + else: cmd + let c2 = c % quoteShell(outp) + rawMessage(conf, hintExecuting, c2) + if execShellCmd(c2) != status: + rawMessage(conf, errGenerated, "executing of external program failed: " & c2) d.isPureRst = true var rst = parseRst(readFile(filen.string), filen.string, 0, 1, d.hasToc, diff --git a/compiler/installer.ini b/compiler/installer.ini index 79eb7178a..2d3a92b32 100644 --- a/compiler/installer.ini +++ b/compiler/installer.ini @@ -68,6 +68,7 @@ Files: "compiler" Files: "doc" Files: "doc/html" Files: "tools" +Files: "nimpretty" Files: "nimsuggest" Files: "nimsuggest/tests/*.nim" Files: "web/website.ini" diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 61c530f61..e683984c5 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1560,6 +1560,8 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode = rhsTyp = rhsTyp.lastSon if cmpTypes(c, lhs.typ, rhsTyp) in {isGeneric, isEqual}: internalAssert c.config, c.p.resultSym != nil + # Make sure the type is valid for the result variable + typeAllowedCheck(c.config, n.info, rhsTyp, skResult) lhs.typ = rhsTyp c.p.resultSym.typ = rhsTyp c.p.owner.typ.sons[0] = rhsTyp diff --git a/compiler/vm.nim b/compiler/vm.nim index e38642de8..faff81697 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -557,11 +557,15 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = # a = b.c decodeBC(rkNode) let src = regs[rb].node - if src.kind notin {nkEmpty..nkNilLit}: - let n = src.sons[rc + ord(src.kind == nkObjConstr)].skipColon + case src.kind + of nkEmpty..nkNilLit: + stackTrace(c, tos, pc, errNilAccess) + of nkObjConstr: + let n = src.sons[rc + 1].skipColon regs[ra].node = n else: - stackTrace(c, tos, pc, errNilAccess) + let n = src.sons[rc] + regs[ra].node = n of opcWrObj: # a.b = c decodeBC(rkNode) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index e87347ec8..b6b5bf4f2 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1842,6 +1842,9 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) = let s = n.sons[0].sym if s.magic != mNone: genMagic(c, n, dest, s.magic) + elif s.kind == skMethod: + localError(c.config, n.info, "cannot call method " & s.name.s & + " at compile time") elif matches(s, "stdlib", "marshal", "to"): # XXX marshal load&store should not be opcodes, but use the # general callback mechanisms. diff --git a/koch.nim b/koch.nim index 66b64b020..0c24f70de 100644 --- a/koch.nim +++ b/koch.nim @@ -60,7 +60,6 @@ Commands for core developers: tests [options] run the testsuite (run a subset of tests by specifying a category, e.g. `tests cat async`) temp options creates a temporary compiler for testing - winrelease creates a Windows release pushcsource push generated C sources to its repo Web options: --googleAnalytics:UA-... add the given google analytics code to the docs. To @@ -75,33 +74,6 @@ template withDir(dir, body) = finally: setCurrentdir(old) -proc testUnixInstall() = - let oldCurrentDir = getCurrentDir() - try: - let destDir = getTempDir() - copyFile("build/nim-$1.tar.xz" % VersionAsString, - destDir / "nim-$1.tar.xz" % VersionAsString) - setCurrentDir(destDir) - execCleanPath("tar -xJf nim-$1.tar.xz" % VersionAsString) - setCurrentDir("nim-$1" % VersionAsString) - execCleanPath("sh build.sh") - # first test: try if './bin/nim --version' outputs something sane: - let output = execProcess("./bin/nim --version").splitLines - if output.len > 0 and output[0].contains(VersionAsString): - echo "Version check: success" - execCleanPath("./bin/nim c koch.nim") - execCleanPath("./koch boot -d:release", destDir / "bin") - # check the docs build: - execCleanPath("./koch docs", destDir / "bin") - # check nimble builds: - execCleanPath("./koch tools") - # check the tests work: - execCleanPath("./koch tests", destDir / "bin") - else: - echo "Version check: failure" - finally: - setCurrentDir oldCurrentDir - proc tryExec(cmd: string): bool = echo(cmd) result = execShellCmd(cmd) == 0 @@ -475,6 +447,37 @@ proc pushCsources() = finally: setCurrentDir(cwd) +proc testUnixInstall(cmdLineRest: string) = + csource("-d:release " & cmdLineRest) + xz(cmdLineRest) + let oldCurrentDir = getCurrentDir() + try: + let destDir = getTempDir() + copyFile("build/nim-$1.tar.xz" % VersionAsString, + destDir / "nim-$1.tar.xz" % VersionAsString) + setCurrentDir(destDir) + execCleanPath("tar -xJf nim-$1.tar.xz" % VersionAsString) + setCurrentDir("nim-$1" % VersionAsString) + execCleanPath("sh build.sh") + # first test: try if './bin/nim --version' outputs something sane: + let output = execProcess("./bin/nim --version").splitLines + if output.len > 0 and output[0].contains(VersionAsString): + echo "Version check: success" + execCleanPath("./bin/nim c koch.nim") + execCleanPath("./koch boot -d:release", destDir / "bin") + # check the docs build: + execCleanPath("./koch docs", destDir / "bin") + # check nimble builds: + execCleanPath("./koch testtools") + # check the tests work: + putEnv("NIM_EXE_NOT_IN_PATH", "NOT_IN_PATH") + execCleanPath("./koch tests", destDir / "bin") + #execCleanPath("./koch tests cat newconfig", destDir / "bin") + else: + echo "Version check: failure" + finally: + setCurrentDir oldCurrentDir + proc valgrind(cmd: string) = # somewhat hacky: '=' sign means "pass to valgrind" else "pass to Nim" let args = parseCmdLine(cmd) @@ -522,15 +525,15 @@ when isMainModule: of "geninstall": geninstall(op.cmdLineRest) of "distrohelper": geninstall() of "install": install(op.cmdLineRest) - of "testinstall": testUnixInstall() + of "testinstall": testUnixInstall(op.cmdLineRest) of "test", "tests": tests(op.cmdLineRest) of "temp": temp(op.cmdLineRest) of "xtemp": xtemp(op.cmdLineRest) - #of "winrelease": winRelease() of "wintools": bundleWinTools() of "nimble": buildNimble(existsDir(".git")) of "nimsuggest": bundleNimsuggest(buildExe=true) of "tools": buildTools(existsDir(".git")) + of "testtools": buildTools(true) of "pushcsource", "pushcsources": pushCsources() of "valgrind": valgrind(op.cmdLineRest) else: showHelp() diff --git a/lib/pure/strscans.nim b/lib/pure/strscans.nim index 734317e67..77763ff43 100644 --- a/lib/pure/strscans.nim +++ b/lib/pure/strscans.nim @@ -317,8 +317,8 @@ macro scanf*(input: string; pattern: static[string]; results: varargs[typed]): b template at(s: string; i: int): char = (if i < s.len: s[i] else: '\0') template matchError() = - error("type mismatch between pattern '$" & pattern[p] & "' (position: " & $p & ") and " & repr(getType(results[i])) & - " var '" & repr(results[i]) & "'") + error("type mismatch between pattern '$" & pattern[p] & "' (position: " & $p & + ") and " & $getTypeInst(results[i]) & " var '" & repr(results[i]) & "'") var i = 0 var p = 0 diff --git a/lib/system.nim b/lib/system.nim index 353500a4a..49e6a396d 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2332,6 +2332,16 @@ proc `==`*[I, T](x, y: array[I, T]): bool = return result = true +proc `==`*[T](x, y: openarray[T]): bool = + if x.len != y.len: + return false + + for f in low(x)..high(x): + if x[f] != y[f]: + return false + + result = true + proc `@`*[T](a: openArray[T]): seq[T] = ## turns an openarray into a sequence. This is not as efficient as turning ## a fixed length array into a sequence as it always copies every element diff --git a/tests/ccgbugs/tcodegenbug1.nim b/tests/ccgbugs/tcodegenbug1.nim index fce74de0c..012a4de47 100644 --- a/tests/ccgbugs/tcodegenbug1.nim +++ b/tests/ccgbugs/tcodegenbug1.nim @@ -2,7 +2,8 @@ discard """ output: '''obj = (inner: (kind: Just, id: 7)) obj.inner.id = 7 id = 7 -obj = (inner: (kind: Just, id: 7))''' +obj = (inner: (kind: Just, id: 7)) +2''' """ # bug #6960 @@ -105,3 +106,35 @@ type proc bug5137(d: MyIntDistinct) = discard d.MyInt + +#------------------------------------- +# bug #8979 + +type + MyKind = enum + Fixed, Float + + MyObject = object + someInt: int + case kind: MyKind + of Float: index: string + of Fixed: nil + + MyResult = object + val: array[0..1, string] + vis: set[0..1] + +import macros + +func myfunc(obj: MyObject): MyResult {.raises: [].} = + template index: auto = + case obj.kind: + of Float: $obj.index + of Fixed: "Fixed" + macro to_str(a: untyped): string = + result = newStrLitNode(a.repr) + result.val[0] = index + result.val[1] = to_str(obj.kind + Ola) + +let x = MyObject(someInt: 10, kind: Fixed) +echo myfunc(x).val.len diff --git a/tests/compilerapi/tcompilerapi.nim b/tests/compilerapi/tcompilerapi.nim index 90d343264..3d7d6b85f 100644 --- a/tests/compilerapi/tcompilerapi.nim +++ b/tests/compilerapi/tcompilerapi.nim @@ -44,4 +44,11 @@ proc main() = destroyInterpreter(intr) -main() \ No newline at end of file +if existsEnv("NIM_EXE_NOT_IN_PATH"): + # effectively disable this test as 'nim' is not in the PATH so tcompilerapi + # cannot find Nim's standard library: + echo "top level statements are executed!" + echo "2.0" + echo "my secret" +else: + main() diff --git a/tests/newconfig/tfoo.nims b/tests/newconfig/tfoo.nims index 3be42c38a..b9b9a87af 100644 --- a/tests/newconfig/tfoo.nims +++ b/tests/newconfig/tfoo.nims @@ -37,7 +37,9 @@ assert wd != getCurrentDir() cd(wd) assert wd == getCurrentDir() -assert findExe("nim") != "" +when false: + # this doesn't work in a 'koch testintall' environment + assert findExe("nim") != "" # general tests mode = ScriptMode.Verbose @@ -69,12 +71,16 @@ assert dirExists("tempXYZ") == false mkDir("tempXYZ") assert dirExists("tempXYZ") == true assert fileExists("tempXYZ/koch.nim") == false -cpFile("koch.nim", "tempXYZ/koch.nim") -assert fileExists("tempXYZ/koch.nim") == true -cpDir("nimsuggest", "tempXYZ/.") -assert dirExists("tempXYZ/tests") == true -assert fileExists("tempXYZ/nimsuggest.nim") == true -rmFile("tempXYZ/koch.nim") -assert fileExists("tempXYZ/koch.nim") == false + +when false: + # this doesn't work in a 'koch testintall' environment + cpFile("koch.nim", "tempXYZ/koch.nim") + assert fileExists("tempXYZ/koch.nim") == true + cpDir("nimsuggest", "tempXYZ/.") + assert dirExists("tempXYZ/tests") == true + assert fileExists("tempXYZ/nimsuggest.nim") == true + rmFile("tempXYZ/koch.nim") + assert fileExists("tempXYZ/koch.nim") == false + rmDir("tempXYZ") assert dirExists("tempXYZ") == false diff --git a/tests/openarray/t8259.nim b/tests/openarray/t8259.nim new file mode 100644 index 000000000..40ff2b2f1 --- /dev/null +++ b/tests/openarray/t8259.nim @@ -0,0 +1,7 @@ +discard """ + line: 6 + errormsg: "invalid type: 'openarray[int]' for result" +""" + +proc foo(a: openArray[int]):auto = a +echo foo(toOpenArray([1, 2], 0, 2)) diff --git a/tests/stdlib/t8925.nim b/tests/stdlib/t8925.nim new file mode 100644 index 000000000..d3dc1ea86 --- /dev/null +++ b/tests/stdlib/t8925.nim @@ -0,0 +1,16 @@ +discard """ + file: "strscans.nim" + errormsg: "type mismatch between pattern '$i' (position: 1) and HourRange var 'hour'" +""" + +import strscans + +type + HourRange = range[0..23] + +var + hour: HourRange + timeStr: string + +if scanf(timeStr, "$i", hour): + discard diff --git a/tests/vm/t2574.nim b/tests/vm/t2574.nim new file mode 100644 index 000000000..86602aeaf --- /dev/null +++ b/tests/vm/t2574.nim @@ -0,0 +1,14 @@ +discard """ + line: 14 + errormsg: "cannot call method eval at compile time" +""" + +type + PExpr = ref object of RootObj + +method eval(e: PExpr): int = + discard + +static: + let x = PExpr() + discard x.eval diff --git a/tests/vm/t4952.nim b/tests/vm/t4952.nim new file mode 100644 index 000000000..fc76fa4df --- /dev/null +++ b/tests/vm/t4952.nim @@ -0,0 +1,17 @@ +import macros + +proc doCheck(tree: NimNode) = + let res: tuple[n: NimNode] = (n: tree) + assert: tree.kind == res.n.kind + for sub in tree: + doCheck(sub) + +macro id(body: untyped): untyped = + doCheck(body) + +id(foo((i: int))) + +static: + let tree = newTree(nnkExprColonExpr) + let t = (n: tree) + assert: t.n.kind == tree.kind diff --git a/tools/kochdocs.nim b/tools/kochdocs.nim index 5e14666ab..d24eba5dc 100644 --- a/tools/kochdocs.nim +++ b/tools/kochdocs.nim @@ -3,7 +3,7 @@ import os, strutils, osproc const - gaCode* = " --googleAnalytics:UA-48159761-1" + gaCode* = " --doc.googleAnalytics:UA-48159761-1" nimArgs = "--hint[Conf]:off --hint[Path]:off --hint[Processing]:off -d:boot --putenv:nimversion=$#" % system.NimVersion gitUrl = "https://github.com/nim-lang/Nim" |