Skip to content

Commit

Permalink
fixes #13519
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq committed Mar 10, 2020
1 parent 416d8a7 commit ed57eff
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 7 deletions.
4 changes: 4 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 5 additions & 2 deletions compiler/ast.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
6 changes: 4 additions & 2 deletions compiler/commands.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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":
Expand Down
2 changes: 1 addition & 1 deletion lib/pure/asyncdispatch.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion lib/pure/asyncmacro.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion lib/system/assertions.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
21 changes: 21 additions & 0 deletions tests/generics/tarc_misc.nim
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit ed57eff

Please sign in to comment.