summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-10-12 23:34:43 +0200
committerAraq <rumpf_a@web.de>2012-10-12 23:34:43 +0200
commit1d307983631b496964d1936a26795fce26da3e39 (patch)
tree35659ddc63cadea759b99b2ed72c29a34b05f04e
parentbfda844ccc7f8910d8003a7902323a19a5efea68 (diff)
downloadNim-1d307983631b496964d1936a26795fce26da3e39.tar.gz
bugfix: threads should work again; fixes #220
-rwxr-xr-xcompiler/semexprs.nim3
-rwxr-xr-xcompiler/semgnrc.nim9
-rw-r--r--tests/run/tmixin.nim27
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)