This commit is contained in:
Andreas Rumpf 2019-08-24 06:25:47 +02:00 • committed by GitHub
commit ce7f29e8e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 31 additions and 22 deletions

View file

@ -542,8 +542,6 @@ proc pArg(arg: PNode; c: var Con; isSink: bool): PNode =
branch = copyNode(arg[i]) branch = copyNode(arg[i])
branch.add pArgIfTyped(arg[i][0]) branch.add pArgIfTyped(arg[i][0])
result.add branch result.add branch
elif isAnalysableFieldAccess(arg, c.owner) and isLastRead(arg, c):
result = destructiveMoveVar(arg, c)
else: else:
# an object that is not temporary but passed to a 'sink' parameter # an object that is not temporary but passed to a 'sink' parameter
# results in a copy. # results in a copy.

View file

@ -202,7 +202,7 @@ when false:
assert i < x.len assert i < x.len
x.data[i] = y x.data[i] = y
proc `@`*[T](elems: openArray[T]): NimSeqV2[T] = proc `@`*[T](elems: sink openArray[T]): NimSeqV2[T] =
result.cap = elems.len result.cap = elems.len
result.len = elems.len result.len = elems.len
result.data = cast[type(result.data)](alloc(result.cap * sizeof(T))) result.data = cast[type(result.data)](alloc(result.cap * sizeof(T)))

View file

@ -1794,7 +1794,8 @@ proc cmp*(x, y: string): int {.noSideEffect, procvar.}
## **Note**: The precise result values depend on the used C runtime library and ## **Note**: The precise result values depend on the used C runtime library and
## can differ between operating systems! ## can differ between operating systems!
proc `@`* [IDX, T](a: array[IDX, T]): seq[T] {. when defined(nimHasDefault):
proc `@`* [IDX, T](a: sink array[IDX, T]): seq[T] {.
magic: "ArrToSeq", noSideEffect.} magic: "ArrToSeq", noSideEffect.}
## Turns an array into a sequence. ## Turns an array into a sequence.
## ##
@ -1809,6 +1810,9 @@ proc `@`* [IDX, T](a: array[IDX, T]): seq[T] {.
## ##
## echo @a # => @[1, 3, 5] ## echo @a # => @[1, 3, 5]
## echo @b # => @['f', 'o', 'o'] ## echo @b # => @['f', 'o', 'o']
else:
proc `@`* [IDX, T](a: array[IDX, T]): seq[T] {.
magic: "ArrToSeq", noSideEffect.}
when defined(nimHasDefault): when defined(nimHasDefault):
proc default*(T: typedesc): T {.magic: "Default", noSideEffect.} proc default*(T: typedesc): T {.magic: "Default", noSideEffect.}

View file

@ -75,5 +75,13 @@ proc selfAssign =
selfAssign() selfAssign()
# bug #11833
type FooAt = object
proc testWrongAt() =
var x = @[@[FooAt()]]
testWrongAt()
let (a, d) = allocCounters() let (a, d) = allocCounters()
discard cprintf("%ld new: %ld\n", a - unpairedEnvAllocs() - d, allocs) discard cprintf("%ld new: %ld\n", a - unpairedEnvAllocs() - d, allocs)

View file

@ -2,7 +2,6 @@ discard """
cmd: '''nim c --newruntime $file''' cmd: '''nim c --newruntime $file'''
output: '''@[1] output: '''@[1]
@[116, 101, 115, 116] @[116, 101, 115, 116]
test
@[1953719668, 875770417]''' @[1953719668, 875770417]'''
""" """
@ -13,7 +12,7 @@ echo cast[seq[uint8]](@[1])
echo cast[seq[uint8]]("test") echo cast[seq[uint8]]("test")
discard cast[string](@[116'u8, 101, 115, 116]) discard cast[string](@[116'u8, 101, 115, 116])
echo cast[string](@[116'u8, 101, 115, 116]) #echo cast[string](@[116'u8, 101, 115, 116, 0])
var a = cast[seq[uint32]]("test1234") var a = cast[seq[uint32]]("test1234")
a.setLen(2) a.setLen(2)
echo a echo a

View file

@ -8,9 +8,9 @@ proc `@`[T](a: openArray[T]): seq[T]
first type mismatch at position: 1 first type mismatch at position: 1
required type for a: openarray[T] required type for a: openarray[T]
but expression '[int]' is of type: array[0..0, type int] but expression '[int]' is of type: array[0..0, type int]
proc `@`[IDX, T](a: array[IDX, T]): seq[T] proc `@`[IDX, T](a: sink array[IDX, T]): seq[T]
first type mismatch at position: 1 first type mismatch at position: 1
required type for a: array[IDX, T] required type for a: sink array[IDX, T]
but expression '[int]' is of type: array[0..0, type int] but expression '[int]' is of type: array[0..0, type int]
expression: @[int] expression: @[int]