Merge branch 'devel' into araq-misc

This commit is contained in:
Araq
2018-08-13 20:16:18 +02:00
13 changed files with 90 additions and 20 deletions

View File

@@ -1130,8 +1130,8 @@ proc genAsgn(p: BProc, e: PNode, fastAsgn: bool) =
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:

View File

@@ -1819,6 +1819,10 @@ proc userConvMatch(c: PContext, m: var TCandidate, f, a: PType,
# see tests/tgenericconverter:
let srca = typeRel(m, src, a)
if srca notin {isEqual, isGeneric, isSubtype}: continue
let constraint = c.converters[i].typ.n[1].sym.constraint
if not constraint.isNil and not matchNodeKinds(constraint, arg):
continue
let destIsGeneric = containsGenericType(dest)
if destIsGeneric:

View File

@@ -539,11 +539,8 @@ proc transformFor(c: PTransf, n: PNode): PTransNode =
if call.kind notin nkCallKinds or call.sons[0].kind != nkSym or
call.sons[0].typ.callConv == ccClosure:
n.sons[length-1] = transformLoopBody(c, n.sons[length-1]).PNode
if not c.tooEarly:
n.sons[length-2] = transform(c, n.sons[length-2]).PNode
result[1] = lambdalifting.liftForLoop(c.graph, n, getCurrOwner(c)).PTransNode
else:
result[1] = newNode(nkEmpty).PTransNode
n.sons[length-2] = transform(c, n.sons[length-2]).PNode
result[1] = lambdalifting.liftForLoop(c.graph, n, getCurrOwner(c)).PTransNode
discard c.breakSyms.pop
return result

View File

@@ -57,7 +57,8 @@ Commands for core developers:
zip builds the installation zip package
xz builds the installation tar.xz package
testinstall test tar.xz package; Unix only!
tests [options] run the testsuite
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

View File

@@ -621,12 +621,13 @@ iterator rsplit*(s: string, sep: string, maxsplit: int = -1,
## Substrings are separated from the right by the string `sep`
rsplitCommon(s, sep, maxsplit, sep.len)
iterator splitLines*(s: string): string =
iterator splitLines*(s: string, keepEol = false): string =
## Splits the string `s` into its containing lines.
##
## Every `character literal <manual.html#character-literals>`_ newline
## combination (CR, LF, CR-LF) is supported. The result strings contain no
## trailing ``\n``.
## trailing end of line characters unless parameter ``keepEol`` is set to
## ``true``.
##
## Example:
##
@@ -646,22 +647,30 @@ iterator splitLines*(s: string): string =
## ""
var first = 0
var last = 0
var eolpos = 0
while true:
while last < s.len and s[last] notin {'\c', '\l'}: inc(last)
yield substr(s, first, last-1)
# skip newlines:
if last >= s.len: break
if s[last] == '\l': inc(last)
elif s[last] == '\c':
inc(last)
if last < s.len and s[last] == '\l': inc(last)
eolpos = last
if last < s.len:
if s[last] == '\l': inc(last)
elif s[last] == '\c':
inc(last)
if last < s.len and s[last] == '\l': inc(last)
yield substr(s, first, if keepEol: last-1 else: eolpos-1)
# no eol characters consumed means that the string is over
if eolpos == last:
break
first = last
proc splitLines*(s: string): seq[string] {.noSideEffect,
proc splitLines*(s: string, keepEol = false): seq[string] {.noSideEffect,
rtl, extern: "nsuSplitLines".} =
## The same as the `splitLines <#splitLines.i,string>`_ iterator, but is a
## proc that returns a sequence of substrings.
accumulateResult(splitLines(s))
accumulateResult(splitLines(s, keepEol=keepEol))
proc countLines*(s: string): int {.noSideEffect,
rtl, extern: "nsuCountLines".} =

View File

@@ -0,0 +1,2 @@
proc head*[T](pp: var array[1,T]): var T =
result = pp[0]

View File

@@ -0,0 +1,10 @@
import rtarray
type
T = tuple[x:int]
var
arr: array[1,T]
proc init*() =
discard head(arr)

4
tests/ccgbugs/t8616.nim Normal file
View File

@@ -0,0 +1,4 @@
import pkg8616 / scheduler
when isMainModule:
init()

12
tests/closure/t8550.nim Normal file
View File

@@ -0,0 +1,12 @@
discard """
output: "@[\"42\"]"
"""
proc chk_fail(): seq[string] =
iterator x(): int {.closure.} = yield 42
proc f(cl: iterator(): int {.closure.}): seq[string] =
result = @[]
for i in cl(): result.add($i)
result = f(x)
echo(chk_fail())

View File

@@ -0,0 +1,20 @@
discard """
file: "tconverter_with_constraint.nim"
line: 20
errormsg: "type mismatch: got <int>"
"""
type
MyType = distinct int
converter to_mytype(m: int{lit}): MyType =
m.MyType
proc myproc(m: MyType) =
echo m.int, ".MyType"
myproc(1) # call by literal is ok
var x: int = 12
myproc(x) # should fail

View File

@@ -199,6 +199,12 @@ proc testRFind =
assert "0123456789ABCDEFGAH".rfind({'A'..'C'}, 13) == 12
assert "0123456789ABCDEFGAH".rfind({'G'..'H'}, 13) == -1
proc testSplitLines() =
let fixture = "a\nb\rc\r\nd"
assert len(fixture.splitLines) == 4
assert splitLines(fixture) == @["a", "b", "c", "d"]
assert splitLines(fixture, keepEol=true) == @["a\n", "b\r", "c\r\n", "d"]
proc testCountLines =
proc assertCountLines(s: string) = assert s.countLines == s.splitLines.len
assertCountLines("")
@@ -229,7 +235,7 @@ proc testParseInts =
assert "72".parseHexInt == 114
assert "FF".parseHexInt == 255
assert "ff".parseHexInt == 255
assert "fF".parseHexInt == 255
assert "fF".parseHexInt == 255
assert "0x7_2".parseHexInt == 114
rejectParse "".parseHexInt
rejectParse "_".parseHexInt
@@ -252,6 +258,7 @@ proc testParseInts =
testDelete()
testFind()
testRFind()
testSplitLines()
testCountLines()
testParseInts()

View File

@@ -527,5 +527,9 @@ proc processCategory(r: var TResults, cat: Category, options: string) =
# We can't test it because it depends on a third party.
discard # TODO: Move untestable tests to someplace else, i.e. nimble repo.
else:
var testsRun = 0
for name in os.walkFiles("tests" & DirSep &.? cat.string / "t*.nim"):
testSpec r, makeTest(name, options, cat)
inc testsRun
if testsRun == 0:
echo "[Warning] - Invalid category specified \"", cat.string, "\", no tests were run"

View File

@@ -22,7 +22,7 @@ const
Command:
all run all tests
c|category <category> run all the tests of a certain category
c|cat|category <category> run all the tests of a certain category
r|run <test> run single test file
html generate $1 from the database
Arguments: