diff options
author | Araq <rumpf_a@web.de> | 2012-10-12 23:34:43 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2012-10-12 23:34:43 +0200 |
commit | 1d307983631b496964d1936a26795fce26da3e39 (patch) | |
tree | 35659ddc63cadea759b99b2ed72c29a34b05f04e | |
parent | bfda844ccc7f8910d8003a7902323a19a5efea68 (diff) | |
download | Nim-1d307983631b496964d1936a26795fce26da3e39.tar.gz |
bugfix: threads should work again; fixes #220
-rwxr-xr-x | compiler/semexprs.nim | 3 | ||||
-rwxr-xr-x | compiler/semgnrc.nim | 9 | ||||
-rw-r--r-- | tests/run/tmixin.nim | 27 |
3 files changed, 34 insertions, 5 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index adcd67ea3..59089d01c 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -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: diff --git a/compiler/semgnrc.nim b/compiler/semgnrc.nim index dc0be54cb..4eaa5f39b 100755 --- a/compiler/semgnrc.nim +++ b/compiler/semgnrc.nim @@ -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) diff --git a/tests/run/tmixin.nim b/tests/run/tmixin.nim new file mode 100644 index 000000000..d841326a5 --- /dev/null +++ b/tests/run/tmixin.nim @@ -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) |