fixes #1444
This commit is contained in:
parent
dcc00b3960
commit
2c99991d16
6 changed files with 165 additions and 9 deletions
|
|
@ -36,7 +36,8 @@ proc semGenericStmtScope(c: PContext, n: PNode,
|
||||||
template macroToExpand(s: expr): expr =
|
template macroToExpand(s: expr): expr =
|
||||||
s.kind in {skMacro, skTemplate} and (s.typ.len == 1 or sfImmediate in s.flags)
|
s.kind in {skMacro, skTemplate} and (s.typ.len == 1 or sfImmediate in s.flags)
|
||||||
|
|
||||||
proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym): PNode =
|
proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym,
|
||||||
|
ctx: var TIntSet): PNode =
|
||||||
incl(s.flags, sfUsed)
|
incl(s.flags, sfUsed)
|
||||||
case s.kind
|
case s.kind
|
||||||
of skUnknown:
|
of skUnknown:
|
||||||
|
|
@ -48,11 +49,13 @@ proc semGenericStmtSymbol(c: PContext, n: PNode, s: PSym): PNode =
|
||||||
if macroToExpand(s):
|
if macroToExpand(s):
|
||||||
let n = fixImmediateParams(n)
|
let n = fixImmediateParams(n)
|
||||||
result = semTemplateExpr(c, n, s, {efNoSemCheck})
|
result = semTemplateExpr(c, n, s, {efNoSemCheck})
|
||||||
|
result = semGenericStmt(c, result, {}, ctx)
|
||||||
else:
|
else:
|
||||||
result = symChoice(c, n, s, scOpen)
|
result = symChoice(c, n, s, scOpen)
|
||||||
of skMacro:
|
of skMacro:
|
||||||
if macroToExpand(s):
|
if macroToExpand(s):
|
||||||
result = semMacroExpr(c, n, n, s, {efNoSemCheck})
|
result = semMacroExpr(c, n, n, s, {efNoSemCheck})
|
||||||
|
result = semGenericStmt(c, result, {}, ctx)
|
||||||
else:
|
else:
|
||||||
result = symChoice(c, n, s, scOpen)
|
result = symChoice(c, n, s, scOpen)
|
||||||
of skGenericParam:
|
of skGenericParam:
|
||||||
|
|
@ -80,7 +83,7 @@ proc lookup(c: PContext, n: PNode, flags: TSemGenericFlags,
|
||||||
elif s.name.id in ctx:
|
elif s.name.id in ctx:
|
||||||
result = symChoice(c, n, s, scForceOpen)
|
result = symChoice(c, n, s, scForceOpen)
|
||||||
else:
|
else:
|
||||||
result = semGenericStmtSymbol(c, n, s)
|
result = semGenericStmtSymbol(c, n, s, ctx)
|
||||||
# else: leave as nkIdent
|
# else: leave as nkIdent
|
||||||
|
|
||||||
proc newDot(n, b: PNode): PNode =
|
proc newDot(n, b: PNode): PNode =
|
||||||
|
|
@ -95,8 +98,9 @@ proc fuzzyLookup(c: PContext, n: PNode, flags: TSemGenericFlags,
|
||||||
|
|
||||||
var s = qualifiedLookUp(c, n, luf)
|
var s = qualifiedLookUp(c, n, luf)
|
||||||
if s != nil:
|
if s != nil:
|
||||||
result = semGenericStmtSymbol(c, n, s)
|
result = semGenericStmtSymbol(c, n, s, ctx)
|
||||||
else:
|
else:
|
||||||
|
n.sons[0] = semGenericStmt(c, n.sons[0], flags, ctx)
|
||||||
result = n
|
result = n
|
||||||
let n = n[1]
|
let n = n[1]
|
||||||
let ident = considerQuotedIdent(n)
|
let ident = considerQuotedIdent(n)
|
||||||
|
|
@ -107,7 +111,7 @@ proc fuzzyLookup(c: PContext, n: PNode, flags: TSemGenericFlags,
|
||||||
elif s.name.id in ctx:
|
elif s.name.id in ctx:
|
||||||
result = newDot(result, symChoice(c, n, s, scForceOpen))
|
result = newDot(result, symChoice(c, n, s, scForceOpen))
|
||||||
else:
|
else:
|
||||||
let sym = semGenericStmtSymbol(c, n, s)
|
let sym = semGenericStmtSymbol(c, n, s, ctx)
|
||||||
if sym.kind == nkSym:
|
if sym.kind == nkSym:
|
||||||
result = newDot(result, symChoice(c, n, s, scForceOpen))
|
result = newDot(result, symChoice(c, n, s, scForceOpen))
|
||||||
else:
|
else:
|
||||||
|
|
@ -158,6 +162,7 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
of skMacro:
|
of skMacro:
|
||||||
if macroToExpand(s):
|
if macroToExpand(s):
|
||||||
result = semMacroExpr(c, n, n, s, {efNoSemCheck})
|
result = semMacroExpr(c, n, n, s, {efNoSemCheck})
|
||||||
|
result = semGenericStmt(c, result, {}, ctx)
|
||||||
else:
|
else:
|
||||||
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
||||||
result = n
|
result = n
|
||||||
|
|
@ -165,6 +170,7 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||||
if macroToExpand(s):
|
if macroToExpand(s):
|
||||||
let n = fixImmediateParams(n)
|
let n = fixImmediateParams(n)
|
||||||
result = semTemplateExpr(c, n, s, {efNoSemCheck})
|
result = semTemplateExpr(c, n, s, {efNoSemCheck})
|
||||||
|
result = semGenericStmt(c, result, {}, ctx)
|
||||||
else:
|
else:
|
||||||
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
||||||
result = n
|
result = n
|
||||||
|
|
|
||||||
139
config/nim.cfg
Normal file
139
config/nim.cfg
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
# Configuration file for the Nimrod Compiler.
|
||||||
|
# (c) 2013 Andreas Rumpf
|
||||||
|
|
||||||
|
# Feel free to edit the default values as you need.
|
||||||
|
|
||||||
|
# You may set environment variables with
|
||||||
|
# @putenv "key" "val"
|
||||||
|
# Environment variables cannot be used in the options, however!
|
||||||
|
|
||||||
|
cc = gcc
|
||||||
|
|
||||||
|
# example of how to setup a cross-compiler:
|
||||||
|
arm.linux.gcc.exe = "arm-linux-gcc"
|
||||||
|
arm.linux.gcc.linkerexe = "arm-linux-gcc"
|
||||||
|
|
||||||
|
path="$lib/core"
|
||||||
|
path="$lib/pure"
|
||||||
|
path="$lib/pure/collections"
|
||||||
|
path="$lib/pure/concurrency"
|
||||||
|
path="$lib/impure"
|
||||||
|
path="$lib/wrappers"
|
||||||
|
# path="$lib/wrappers/cairo"
|
||||||
|
# path="$lib/wrappers/gtk"
|
||||||
|
# path="$lib/wrappers/lua"
|
||||||
|
# path="$lib/wrappers/opengl"
|
||||||
|
path="$lib/wrappers/pcre"
|
||||||
|
path="$lib/wrappers/readline"
|
||||||
|
path="$lib/wrappers/sdl"
|
||||||
|
# path="$lib/wrappers/x11"
|
||||||
|
path="$lib/wrappers/zip"
|
||||||
|
path="$lib/wrappers/libffi"
|
||||||
|
path="$lib/windows"
|
||||||
|
path="$lib/posix"
|
||||||
|
path="$lib/js"
|
||||||
|
path="$lib/pure/unidecode"
|
||||||
|
|
||||||
|
@if nimbabel:
|
||||||
|
babelpath="$home/.babel/pkgs/"
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if release or quick:
|
||||||
|
obj_checks:off
|
||||||
|
field_checks:off
|
||||||
|
range_checks:off
|
||||||
|
bound_checks:off
|
||||||
|
overflow_checks:off
|
||||||
|
assertions:off
|
||||||
|
stacktrace:off
|
||||||
|
linetrace:off
|
||||||
|
debugger:off
|
||||||
|
line_dir:off
|
||||||
|
dead_code_elim:on
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if release:
|
||||||
|
opt:speed
|
||||||
|
@end
|
||||||
|
|
||||||
|
# additional options always passed to the compiler:
|
||||||
|
--parallel_build: "0" # 0 to auto-detect number of processors
|
||||||
|
|
||||||
|
hint[LineTooLong]=off
|
||||||
|
#hint[XDeclaredButNotUsed]=off
|
||||||
|
|
||||||
|
@if unix:
|
||||||
|
@if not bsd:
|
||||||
|
# -fopenmp
|
||||||
|
gcc.options.linker = "-ldl"
|
||||||
|
gpp.options.linker = "-ldl"
|
||||||
|
clang.options.linker = "-ldl"
|
||||||
|
tcc.options.linker = "-ldl"
|
||||||
|
@end
|
||||||
|
@if bsd or haiku:
|
||||||
|
# BSD got posix_spawn only recently, so we deactivate it for osproc:
|
||||||
|
define:useFork
|
||||||
|
# at least NetBSD has problems with thread local storage:
|
||||||
|
tlsEmulation:on
|
||||||
|
@end
|
||||||
|
@end
|
||||||
|
|
||||||
|
# Configuration for the Intel C/C++ compiler:
|
||||||
|
@if windows:
|
||||||
|
icl.options.speed = "/Ox /arch:SSE2"
|
||||||
|
icl.options.always = "/nologo"
|
||||||
|
@end
|
||||||
|
|
||||||
|
# Configuration for the GNU C/C++ compiler:
|
||||||
|
@if windows:
|
||||||
|
#gcc.path = r"$nimrod\dist\mingw\bin"
|
||||||
|
@if gcc:
|
||||||
|
tlsEmulation:on
|
||||||
|
@end
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if macosx:
|
||||||
|
cc = clang
|
||||||
|
tlsEmulation:on
|
||||||
|
gcc.options.always = "-w -fasm-blocks"
|
||||||
|
gpp.options.always = "-w -fasm-blocks -fpermissive"
|
||||||
|
@else:
|
||||||
|
gcc.options.always = "-w"
|
||||||
|
gpp.options.always = "-w -fpermissive"
|
||||||
|
@end
|
||||||
|
|
||||||
|
gcc.options.speed = "-O3 -fno-strict-aliasing"
|
||||||
|
gcc.options.size = "-Os"
|
||||||
|
gcc.options.debug = "-g3 -O0"
|
||||||
|
|
||||||
|
gpp.options.speed = "-O3 -fno-strict-aliasing"
|
||||||
|
gpp.options.size = "-Os"
|
||||||
|
gpp.options.debug = "-g3 -O0"
|
||||||
|
#passl = "-pg"
|
||||||
|
|
||||||
|
# Configuration for the LLVM GCC compiler:
|
||||||
|
llvm_gcc.options.debug = "-g"
|
||||||
|
llvm_gcc.options.always = "-w"
|
||||||
|
llvm_gcc.options.speed = "-O2"
|
||||||
|
llvm_gcc.options.size = "-Os"
|
||||||
|
|
||||||
|
# Configuration for the LLVM CLang compiler:
|
||||||
|
clang.options.debug = "-g"
|
||||||
|
clang.options.always = "-w"
|
||||||
|
clang.options.speed = "-O3"
|
||||||
|
clang.options.size = "-Os"
|
||||||
|
|
||||||
|
# Configuration for the Visual C/C++ compiler:
|
||||||
|
vcc.options.linker = "/DEBUG /Zi /Fd\"$projectName.pdb\" /F33554432" # set the stack size to 8 MB
|
||||||
|
vcc.options.debug = "/Zi /Fd\"$projectName.pdb\""
|
||||||
|
vcc.options.always = "/nologo"
|
||||||
|
vcc.options.speed = "/Ox /arch:SSE2"
|
||||||
|
vcc.options.size = "/O1"
|
||||||
|
|
||||||
|
# Configuration for the Digital Mars C/C++ compiler:
|
||||||
|
@if windows:
|
||||||
|
dmc.path = r"$nimrod\dist\dm\bin"
|
||||||
|
@end
|
||||||
|
|
||||||
|
# Configuration for the Tiny C Compiler:
|
||||||
|
tcc.options.always = "-w"
|
||||||
|
|
@ -128,7 +128,7 @@ proc mget*[A](s: var TSet[A], key: A): var A =
|
||||||
## for sharing.
|
## for sharing.
|
||||||
assert s.isValid, "The set needs to be initialized."
|
assert s.isValid, "The set needs to be initialized."
|
||||||
var index = rawGet(s, key)
|
var index = rawGet(s, key)
|
||||||
if index >= 0: result = t.data[index].key
|
if index >= 0: result = s.data[index].key
|
||||||
else: raise newException(EInvalidKey, "key not found: " & $key)
|
else: raise newException(EInvalidKey, "key not found: " & $key)
|
||||||
|
|
||||||
proc contains*[A](s: TSet[A], key: A): bool =
|
proc contains*[A](s: TSet[A], key: A): bool =
|
||||||
|
|
|
||||||
|
|
@ -849,13 +849,13 @@ proc contains*[T](s: TSlice[T], value: T): bool {.noSideEffect, inline.} =
|
||||||
## assert((1..3).contains(4) == false)
|
## assert((1..3).contains(4) == false)
|
||||||
result = s.a <= value and value <= s.b
|
result = s.a <= value and value <= s.b
|
||||||
|
|
||||||
template `in` * (x, y: expr): expr {.immediate.} = contains(y, x)
|
template `in` * (x, y: expr): expr {.immediate, dirty.} = contains(y, x)
|
||||||
## Sugar for contains
|
## Sugar for contains
|
||||||
##
|
##
|
||||||
## .. code-block:: Nimrod
|
## .. code-block:: Nimrod
|
||||||
## assert(1 in (1..3) == true)
|
## assert(1 in (1..3) == true)
|
||||||
## assert(5 in (1..3) == false)
|
## assert(5 in (1..3) == false)
|
||||||
template `notin` * (x, y: expr): expr {.immediate.} = not contains(y, x)
|
template `notin` * (x, y: expr): expr {.immediate, dirty.} = not contains(y, x)
|
||||||
## Sugar for not containing
|
## Sugar for not containing
|
||||||
##
|
##
|
||||||
## .. code-block:: Nimrod
|
## .. code-block:: Nimrod
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,11 @@ type MyObj = object
|
||||||
proc foo*(b: any) =
|
proc foo*(b: any) =
|
||||||
var o: MyObj
|
var o: MyObj
|
||||||
echo b.baz, " ", o.x.baz, " ", b.baz()
|
echo b.baz, " ", o.x.baz, " ", b.baz()
|
||||||
|
|
||||||
|
import sets
|
||||||
|
|
||||||
|
var intset = initSet[int]()
|
||||||
|
|
||||||
|
proc func*[T](a: T) =
|
||||||
|
if a in intset: echo("true")
|
||||||
|
else: echo("false")
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
discard """
|
discard """
|
||||||
output: '''5 5 5'''
|
output: '''5 5 5
|
||||||
|
false'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import mdotlookup
|
import mdotlookup
|
||||||
|
|
||||||
foo(7)
|
foo(7)
|
||||||
|
# bug #1444
|
||||||
|
func(4)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue