destructors: defensive programming against wrong generated destructor for string/seq

This commit is contained in:
Andreas Rumpf 2018-12-09 09:20:59 +01:00
commit 5ffa9a8be6
2 changed files with 10 additions and 6 deletions

View file

@ -480,7 +480,7 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
of "native", "gdb": of "native", "gdb":
incl(conf.globalOptions, optCDebug) incl(conf.globalOptions, optCDebug)
conf.options = conf.options + {optLineDir} - {optEndb} conf.options = conf.options + {optLineDir} - {optEndb}
defineSymbol(conf.symbols, "nimTypeNames") # type names are used in gdb pretty printing #defineSymbol(conf.symbols, "nimTypeNames") # type names are used in gdb pretty printing
undefSymbol(conf.symbols, "endb") undefSymbol(conf.symbols, "endb")
else: else:
localError(conf, info, "expected endb|gdb but found " & arg) localError(conf, info, "expected endb|gdb but found " & arg)

View file

@ -309,6 +309,10 @@ proc liftBody(c: PContext; typ: PType; kind: TTypeAttachedOp;
liftBodyAux(a, typ, body, newSymNode(dest).newDeref, newSymNode(src)) liftBodyAux(a, typ, body, newSymNode(dest).newDeref, newSymNode(src))
# recursion is handled explicitly, do not register the type based operation # recursion is handled explicitly, do not register the type based operation
# before 'liftBodyAux': # before 'liftBodyAux':
if c.config.selectedGC == gcDestructors and
typ.kind in {tySequence, tyString} and body.len == 0:
discard "do not cache it yet"
else:
case kind case kind
of attachedAsgn: typ.assignment = result of attachedAsgn: typ.assignment = result
of attachedSink: typ.sink = result of attachedSink: typ.sink = result