mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
fixes #15052
This commit is contained in:
@@ -729,6 +729,15 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc) =
|
||||
else:
|
||||
putIntoDest(p, d, e, "(*$1)" % [rdLoc(a)], a.storage)
|
||||
|
||||
proc cow(p: BProc; n: PNode) =
|
||||
if n.kind == nkHiddenAddr and optSeqDestructors in p.config.globalOptions:
|
||||
if n[0].kind == nkBracketExpr:
|
||||
let strCandidate = n[0][0]
|
||||
if strCandidate.typ.skipTypes(abstractInst).kind == tyString:
|
||||
var a: TLoc
|
||||
initLocExpr(p, strCandidate, a)
|
||||
linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, a)])
|
||||
|
||||
proc genAddr(p: BProc, e: PNode, d: var TLoc) =
|
||||
# careful 'addr(myptrToArray)' needs to get the ampersand:
|
||||
if e[0].typ.skipTypes(abstractInstOwned).kind in {tyRef, tyPtr}:
|
||||
@@ -2699,9 +2708,11 @@ proc expr(p: BProc, n: PNode, d: var TLoc) =
|
||||
of nkReturnStmt: genReturnStmt(p, n)
|
||||
of nkBreakStmt: genBreakStmt(p, n)
|
||||
of nkAsgn:
|
||||
cow(p, n[1])
|
||||
if nfPreventCg notin n.flags:
|
||||
genAsgn(p, n, fastAsgn=false)
|
||||
of nkFastAsgn:
|
||||
cow(p, n[1])
|
||||
if nfPreventCg notin n.flags:
|
||||
# transf is overly aggressive with 'nkFastAsgn', so we work around here.
|
||||
# See tests/run/tcnstseq3 for an example that would fail otherwise.
|
||||
|
||||
@@ -24,6 +24,7 @@ whiley ends :(
|
||||
new line before - @['a']
|
||||
new line after - @['a']
|
||||
finalizer
|
||||
aaaaa
|
||||
closed
|
||||
destroying variable: 20
|
||||
destroying variable: 10
|
||||
@@ -282,3 +283,13 @@ proc hello(): int =
|
||||
|
||||
var leaves {.global.} = hello()
|
||||
doAssert leaves == 42
|
||||
|
||||
# bug #15052
|
||||
|
||||
proc mutstrings =
|
||||
var data = "hello"
|
||||
for c in data.mitems():
|
||||
c = 'a'
|
||||
echo data
|
||||
|
||||
mutstrings()
|
||||
|
||||
Reference in New Issue
Block a user