mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-05 03:14:08 +00:00
bugfix: threads should work again; fixes #220
This commit is contained in:
@@ -471,7 +471,8 @@ proc analyseIfAddressTaken(c: PContext, n: PNode): PNode =
|
||||
result = n
|
||||
case n.kind
|
||||
of nkSym:
|
||||
if skipTypes(n.sym.typ, abstractInst).kind != tyVar:
|
||||
# n.sym.typ can be nil in 'check' mode ...
|
||||
if n.sym.typ != nil and skipTypes(n.sym.typ, abstractInst).kind != tyVar:
|
||||
incl(n.sym.flags, sfAddrTaken)
|
||||
result = newHiddenAddrTaken(c, n)
|
||||
of nkDotExpr:
|
||||
|
||||
@@ -87,7 +87,7 @@ proc Lookup(c: PContext, n: PNode, flags: TSemGenericFlags,
|
||||
if ident.id notin ctx and withinMixin notin flags:
|
||||
localError(n.info, errUndeclaredIdentifier, ident.s)
|
||||
else:
|
||||
if withinMixin in flags:
|
||||
if withinBind in flags:
|
||||
result = symChoice(c, n, s, scClosed)
|
||||
elif s.name.id in ctx:
|
||||
result = symChoice(c, n, s, scForceOpen)
|
||||
@@ -134,26 +134,27 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||
if s != nil:
|
||||
incl(s.flags, sfUsed)
|
||||
isDefinedMagic = s.magic in {mDefined, mDefinedInScope, mCompiles}
|
||||
let scOption = if s.name.id in ctx: scForceOpen else: scOpen
|
||||
case s.kind
|
||||
of skMacro:
|
||||
if macroToExpand(s):
|
||||
result = semMacroExpr(c, n, n, s, false)
|
||||
else:
|
||||
n.sons[0] = symChoice(c, n.sons[0], s, scOpen)
|
||||
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
||||
result = n
|
||||
of skTemplate:
|
||||
if macroToExpand(s):
|
||||
let n = fixImmediateParams(n)
|
||||
result = semTemplateExpr(c, n, s, false)
|
||||
else:
|
||||
n.sons[0] = symChoice(c, n.sons[0], s, scOpen)
|
||||
n.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
||||
result = n
|
||||
# BUGFIX: we must not return here, we need to do first phase of
|
||||
# symbol lookup ...
|
||||
of skUnknown, skParam:
|
||||
# Leave it as an identifier.
|
||||
of skProc, skMethod, skIterator, skConverter:
|
||||
result.sons[0] = symChoice(c, n.sons[0], s, scOpen)
|
||||
result.sons[0] = symChoice(c, n.sons[0], s, scOption)
|
||||
first = 1
|
||||
of skGenericParam:
|
||||
result.sons[0] = newSymNode(s, n.sons[0].info)
|
||||
|
||||
27
tests/run/tmixin.nim
Normal file
27
tests/run/tmixin.nim
Normal file
@@ -0,0 +1,27 @@
|
||||
discard """
|
||||
output: "1\n2"
|
||||
"""
|
||||
|
||||
type
|
||||
TFoo1 = object of TObject
|
||||
v: int
|
||||
TFoo2 = object of TFoo1
|
||||
v2: int
|
||||
|
||||
proc test(f: TFoo1) =
|
||||
echo "1"
|
||||
|
||||
proc Foo[T](f: T) =
|
||||
mixin test
|
||||
test(f)
|
||||
|
||||
var
|
||||
a: TFoo1
|
||||
b: TFoo2
|
||||
|
||||
|
||||
proc test(f: TFoo2) =
|
||||
echo "2"
|
||||
|
||||
Foo(a)
|
||||
Foo(b)
|
||||
Reference in New Issue
Block a user