mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
(cherry picked from commit d9e907c0e2)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
18
tests/arc/twrong_sinkinference.nim
Normal file
18
tests/arc/twrong_sinkinference.nim
Normal 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
|
||||
Reference in New Issue
Block a user