mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-19 11:07:14 +00:00
fixes #13519
This commit is contained in:
@@ -40,6 +40,10 @@
|
||||
- The `{.dynlib.}` pragma is now required for exporting symbols when making
|
||||
shared objects on POSIX and macOS, which make it consistent with the behavior
|
||||
on Windows.
|
||||
- The compiler is now more strict about type conversions concerning proc
|
||||
types: Type conversions cannot be used to hide `.raise` effects or side
|
||||
effects, instead a `cast` must be used. With the flag `--useVersion:1.0` the
|
||||
old behaviour is emulated.
|
||||
|
||||
|
||||
## Library additions
|
||||
|
||||
@@ -592,8 +592,11 @@ const
|
||||
tfReturnsNew* = tfInheritable
|
||||
skError* = skUnknown
|
||||
|
||||
# type flags that are essential for type equality:
|
||||
eqTypeFlags* = {tfIterator, tfNotNil, tfVarIsPtr}
|
||||
var
|
||||
eqTypeFlags* = {tfIterator, tfNotNil, tfVarIsPtr, tfGcSafe, tfNoSideEffect}
|
||||
## type flags that are essential for type equality.
|
||||
## This is now a variable because for emulation of version:1.0 we
|
||||
## might exclude {tfGcSafe, tfNoSideEffect}.
|
||||
|
||||
type
|
||||
TMagic* = enum # symbols that require compiler magic:
|
||||
|
||||
@@ -32,6 +32,7 @@ import
|
||||
pathutils, strtabs
|
||||
|
||||
from incremental import nimIncremental
|
||||
from ast import eqTypeFlags, tfGcSafe, tfNoSideEffect
|
||||
|
||||
# but some have deps to imported modules. Yay.
|
||||
bootSwitch(usedTinyC, hasTinyCBackend, "-d:tinyc")
|
||||
@@ -869,10 +870,11 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
|
||||
of "1.0":
|
||||
defineSymbol(conf.symbols, "NimMajor", "1")
|
||||
defineSymbol(conf.symbols, "NimMinor", "0")
|
||||
# always be compatible with 1.0.2 for now:
|
||||
defineSymbol(conf.symbols, "NimPatch", "2")
|
||||
# always be compatible with 1.0.100:
|
||||
defineSymbol(conf.symbols, "NimPatch", "100")
|
||||
# old behaviors go here:
|
||||
defineSymbol(conf.symbols, "nimOldRelativePathBehavior")
|
||||
ast.eqTypeFlags.excl {tfGcSafe, tfNoSideEffect}
|
||||
else:
|
||||
localError(conf, info, "unknown Nim version; currently supported values are: {1.0}")
|
||||
of "benchmarkvm":
|
||||
|
||||
@@ -278,7 +278,7 @@ when defined(windows) or defined(nimdoc):
|
||||
result.ioPort = createIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 1)
|
||||
result.handles = initSet[AsyncFD]()
|
||||
result.timers.newHeapQueue()
|
||||
result.callbacks = initDeque[proc ()](64)
|
||||
result.callbacks = initDeque[proc () {.closure, gcsafe.}](64)
|
||||
|
||||
var gDisp{.threadvar.}: owned PDispatcher ## Global dispatcher
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ template createCb(retFutureSym, iteratorNameSym,
|
||||
else:
|
||||
{.gcsafe.}:
|
||||
{.push hint[ConvFromXtoItselfNotNeeded]: off.}
|
||||
next.callback = (proc() {.closure, gcsafe.})(identName)
|
||||
next.callback = cast[proc() {.closure, gcsafe.}](identName)
|
||||
{.pop.}
|
||||
except:
|
||||
futureVarCompletions
|
||||
|
||||
@@ -26,7 +26,7 @@ proc failedAssertImpl*(msg: string) {.raises: [], tags: [].} =
|
||||
# by ``assert``.
|
||||
type Hide = proc (msg: string) {.noinline, raises: [], noSideEffect,
|
||||
tags: [].}
|
||||
Hide(raiseAssert)(msg)
|
||||
cast[Hide](raiseAssert)(msg)
|
||||
|
||||
template assertImpl(cond: bool, msg: string, expr: string, enabled: static[bool]) =
|
||||
when enabled:
|
||||
|
||||
21
tests/generics/tarc_misc.nim
Normal file
21
tests/generics/tarc_misc.nim
Normal file
@@ -0,0 +1,21 @@
|
||||
discard """
|
||||
output: ''''''
|
||||
cmd: "nim c --gc:arc $file"
|
||||
"""
|
||||
|
||||
# bug #13519
|
||||
|
||||
var unrelated: seq[proc() {.closure, gcsafe.}]
|
||||
|
||||
unrelated.add proc () =
|
||||
echo "gcsafe"
|
||||
|
||||
import tables, sequtils
|
||||
let t = newTable[int, proc()]()
|
||||
|
||||
type
|
||||
MyProc = proc() {.closure.}
|
||||
|
||||
var result: seq[MyProc] = @[]
|
||||
for x in t.values:
|
||||
result.add(x)
|
||||
Reference in New Issue
Block a user