fixes #14079 [backport:1.2] (#14163)

(cherry picked from commit d9e907c0e2)
This commit is contained in:
Andreas Rumpf
2020-04-29 21:58:59 +02:00
committed by narimiran
parent dc3919bb1a
commit 49decbf4b4
6 changed files with 36 additions and 7 deletions

View File

@@ -893,7 +893,8 @@ proc track(tracked: PEffects, n: PNode) =
when false: cstringCheck(tracked, n)
if tracked.owner.kind != skMacro:
createTypeBoundOps(tracked, n[0].typ, n.info)
checkForSink(tracked.config, tracked.owner, n[1])
if n[0].kind != nkSym or not isLocalVar(tracked, n[0].sym):
checkForSink(tracked.config, tracked.owner, n[1])
of nkVarSection, nkLetSection:
for child in n:
let last = lastSon(child)

View File

@@ -548,7 +548,8 @@ proc allowsNilDeprecated(c: TCandidate, f: PType): TTypeRelation =
result = isNone
proc inconsistentVarTypes(f, a: PType): bool {.inline.} =
result = f.kind != a.kind and (f.kind in {tyVar, tyLent} or a.kind in {tyVar, tyLent})
result = f.kind != a.kind and
(f.kind in {tyVar, tyLent, tySink} or a.kind in {tyVar, tyLent, tySink})
proc procParamTypeRel(c: var TCandidate, f, a: PType): TTypeRelation =
## For example we have:

View File

@@ -48,8 +48,7 @@ proc checkForSink*(config: ConfigRef; owner: PSym; arg: PNode) =
# we only report every potential 'sink' parameter only once:
incl arg.sym.flags, sfWasForwarded
message(config, arg.info, hintPerformance,
("could not turn '$1' to a sink parameter " &
"because '$2' was forward declared") % [arg.sym.name.s, owner.name.s])
"could not turn '$1' to a sink parameter" % [arg.sym.name.s])
#echo config $ arg.info, " candidate for a sink parameter here"
of nkStmtList, nkStmtListExpr, nkBlockStmt, nkBlockExpr:
if not isEmptyType(arg.typ):

View File

@@ -504,7 +504,7 @@ template sortedByIt*(seq1, op: untyped): untyped =
# Nested sort
assert people.sortedByIt((it.age, it.name)) == @[(name: "p2", age: 20),
(name: "p3", age: 30), (name: "p4", age: 30), (name: "p1", age: 60)]
var result = sorted(seq1, proc(x, y: type(seq1[0])): int =
var result = sorted(seq1, proc(x, y: typeof(seq1[0])): int =
var it {.inject.} = x
let a = op
it = y

View File

@@ -46,7 +46,7 @@ type
proc `=destroy`(x: var AObj) =
close(x.io)
echo "closed"
var x = B(io: newStringStream("thestream"))
@@ -64,4 +64,14 @@ proc main() =
cryptCTR(nonce2.toOpenArray(0, nonce2.len-1))
doAssert(nonce2 == "0A234567")
main()
main()
# bug #14079
import std/algorithm
let
n = @["c", "b"]
q = @[("c", "2"), ("b", "1")]
assert n.sortedByIt(it) == @["b", "c"], "fine"
assert q.sortedByIt(it[0]) == @[("b", "1"), ("c", "2")], "fails under arc"

View File

@@ -0,0 +1,18 @@
discard """
cmd: "nim c --gc:arc $file"
errormsg: "type mismatch: got <proc (a: string, b: sink string){.noSideEffect, gcsafe, locks: 0.}>"
line: 18
"""
type
Foo = proc (a, b: string)
proc take(x: Foo) =
x("a", "b")
proc willSink(a, b: string) = # {.nosinks.} =
var arr: array[3, string]
var x = a
arr[0] = b
take willSink