summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/parser.nim2
-rwxr-xr-xcompiler/semexprs.nim4
-rwxr-xr-xcompiler/semtypes.nim30
-rwxr-xr-xexamples/hallo.nim2
-rwxr-xr-xlib/core/macros.nim6
-rw-r--r--lib/pure/unittest.nim4
-rwxr-xr-xlib/wrappers/tcl.nim2
-rwxr-xr-xtests/compile/tdumpast.nim2
-rw-r--r--tests/run/tstringinterp.nim8
-rw-r--r--tests/run/tusingstatement.nim4
-rwxr-xr-xtools/niminst/niminst.nim2
11 files changed, 32 insertions, 34 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index ba7107c42..2ba04ed1b 100755
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -619,7 +619,7 @@ proc parseParamList(p: var TParser, retColon = true): PNode =
     while true: 
       case p.tok.tokType      #optInd(p, a);
       of tkSymbol, tkAccent: 
-        a = parseIdentColonEquals(p, {})
+        a = parseIdentColonEquals(p, {withBothOptional})
       of tkParRi: 
         break 
       else: 
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index d3b30e24b..147f38abb 100755
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -918,7 +918,7 @@ proc semAsgn(c: PContext, n: PNode): PNode =
     let nOrig = n.copyTree
     a = builtinFieldAccess(c, a, {efLValue})
     if a == nil: 
-      return propertyWriteAccess(c, n, nOrig, a)
+      return propertyWriteAccess(c, n, nOrig, n[0])
   of nkBracketExpr: 
     # a[i] = x
     # --> `[]=`(a, i, x)
@@ -1028,7 +1028,7 @@ proc semExpandToAst(c: PContext, n: PNode, magicSym: PSym,
 
     # Preserve the magic symbol in order to be handled in evals.nim
     n.sons[0] = newSymNode(magicSym, n.info)
-    n.typ = expandedSym.getReturnType
+    n.typ = getSysSym("PNimrodNode").typ # expandedSym.getReturnType
     result = n
   else:
     result = semDirectOp(c, n, flags)
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index b8f703a51..fc45de08c 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -523,8 +523,7 @@ proc addParamOrResult(c: PContext, param: PSym, kind: TSymKind) =
 proc semProcTypeNode(c: PContext, n, genericParams: PNode, 
                      prev: PType, kind: TSymKind): PType = 
   var
-    def, res: PNode
-    typ: PType
+    res: PNode
     cl: TIntSet
   checkMinSonsLen(n, 1)
   result = newOrPrevType(tyProc, prev, c)
@@ -541,20 +540,18 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode,
     var a = n.sons[i]
     if a.kind != nkIdentDefs: IllFormedAst(a)
     checkMinSonsLen(a, 3)
-    var length = sonsLen(a)
-    if a.sons[length-2].kind != nkEmpty: 
+    var
+      typ: PType = nil
+      def: PNode = nil      
+      length = sonsLen(a)
+      hasType = a.sons[length-2].kind != nkEmpty
+      hasDefault = a.sons[length-1].kind != nkEmpty
+
+    if hasType:
       typ = paramType(c, a.sons[length-2], genericParams, cl)
       #if matchType(typ, [(tyVar, 0)], tyGenericInvokation):
       #  debug a.sons[length-2][0][1]
-    else:
-      typ = nil
-      # consider: 
-      # template T(x)
-      # it's wrong, but the parser might not generate a fatal error (when in
-      # 'check' mode for example), so we need to check again here:
-      if unlikely(a.sons[length-1].kind == nkEmpty): continue
-      
-    if a.sons[length-1].kind != nkEmpty:
+    if hasDefault:
       def = semExprWithType(c, a.sons[length-1]) 
       # check type compability between def.typ and typ:
       if typ == nil:
@@ -565,15 +562,16 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode,
         # proc sort[T](cmp: proc(a, b: T): int = cmp)
         if not containsGenericType(typ):
           def = fitNode(c, typ, def)
-    else:
-      def = ast.emptyNode
+    if not (hasType or hasDefault):
+      typ = newTypeS(tyExpr, c)
+      
     if skipTypes(typ, {tyGenericInst}).kind == tyEmpty: continue
     for j in countup(0, length-3): 
       var arg = newSymS(skParam, a.sons[j], c)
       arg.typ = typ
       arg.position = counter
       inc(counter)
-      if def.kind != nkEmpty: arg.ast = copyTree(def)
+      if def != nil and def.kind != nkEmpty: arg.ast = copyTree(def)
       if ContainsOrIncl(check, arg.name.id): 
         LocalError(a.sons[j].info, errAttemptToRedefine, arg.name.s)
       addSon(result.n, newSymNode(arg))
diff --git a/examples/hallo.nim b/examples/hallo.nim
index c8a4a3a8c..d94da8c1f 100755
--- a/examples/hallo.nim
+++ b/examples/hallo.nim
@@ -1,3 +1,3 @@
 # Hello world program
 
-echo "Hello World!"
+echo "Hello World"
diff --git a/lib/core/macros.nim b/lib/core/macros.nim
index 1fb012a28..8b08952f0 100755
--- a/lib/core/macros.nim
+++ b/lib/core/macros.nim
@@ -194,15 +194,15 @@ proc lineinfo*(n: PNimrodNode): string {.magic: "NLineInfo".}
   ## returns the position the node appears in the original source file

   ## in the form filename(line, col)

 

-proc parseExpr*(s: string): expr {.magic: "ParseExprToAst".}

+proc parseExpr*(s: string): PNimrodNode {.magic: "ParseExprToAst".}

   ## Compiles the passed string to its AST representation.

   ## Expects a single expression.

 

-proc parseStmt*(s: string): stmt {.magic: "ParseStmtToAst".}

+proc parseStmt*(s: string): PNimrodNode {.magic: "ParseStmtToAst".}

   ## Compiles the passed string to its AST representation.

   ## Expects one or more statements.

 

-proc getAst*(macroOrTemplate: expr): expr {.magic: "ExpandToAst".}

+proc getAst*(macroOrTemplate: expr): PNimrodNode {.magic: "ExpandToAst".}

   ## Obtains the AST nodes returned from a macro or template invocation.

   ## Example:

   ## 

diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim
index 9ff44632d..5220f53e0 100644
--- a/lib/pure/unittest.nim
+++ b/lib/pure/unittest.nim
@@ -94,7 +94,7 @@ template fail* =
 

 macro check*(conditions: stmt): stmt =

   proc standardRewrite(e: PNimrodNode): PNimrodNode =

-    template rewrite(Exp, lineInfoLit: expr, expLit: string): PNimrodNode =

+    template rewrite(Exp, lineInfoLit: expr, expLit: string): stmt =

       if not Exp:

         checkpoint(lineInfoLit & ": Check failed: " & expLit)

         fail()

@@ -107,7 +107,7 @@ macro check*(conditions: stmt): stmt =
     of nnkInfix:

       proc rewriteBinaryOp(op: PNimrodNode): PNimrodNode =

         template rewrite(op, left, right, lineInfoLit: expr, opLit,

-          leftLit, rightLit: string, printLhs, printRhs: bool): PNimrodNode =

+          leftLit, rightLit: string, printLhs, printRhs: bool): stmt =

           block:

             var 

               lhs = left

diff --git a/lib/wrappers/tcl.nim b/lib/wrappers/tcl.nim
index 8836a4296..8cd715838 100755
--- a/lib/wrappers/tcl.nim
+++ b/lib/wrappers/tcl.nim
@@ -87,7 +87,7 @@ const
   IDLE_EVENTS* = 1 shl 5  # WAS 0x10 ???? *
   ALL_EVENTS* = not DONT_WAIT
   VOLATILE* = 1
-  STATIC* = 0
+  TCL_STATIC* = 0
   DYNAMIC* = 3            # Channel
   TCL_STDIN* = 1 shl 1
   TCL_STDOUT* = 1 shl 2
diff --git a/tests/compile/tdumpast.nim b/tests/compile/tdumpast.nim
index d044e1da1..20a041c5b 100755
--- a/tests/compile/tdumpast.nim
+++ b/tests/compile/tdumpast.nim
@@ -6,7 +6,7 @@ template plus(a, b: expr): expr =
   a + b
 
 macro call(e: expr): expr =
-  return newCall("foo", newStrLitNode("bar"))
+  result = newCall("foo", newStrLitNode("bar"))
   
 macro dumpAST(n: stmt): stmt =
   # dump AST as a side-effect and return the inner node
diff --git a/tests/run/tstringinterp.nim b/tests/run/tstringinterp.nim
index e1a55c94b..423e7bb61 100644
--- a/tests/run/tstringinterp.nim
+++ b/tests/run/tstringinterp.nim
@@ -26,7 +26,7 @@ macro formatStyleInterpolation(e: expr): expr =
   proc addString(s: string) =
     formatString.add(s)
 
-  proc addExpr(e: expr) =
+  proc addExpr(e: PNimrodNode) =
     arrayNode.add(e)
     formatString.add("$" & $(idx))
     inc idx
@@ -44,9 +44,9 @@ macro concatStyleInterpolation(e: expr): expr =
   var args: seq[PNimrodNode]
   newSeq(args, 0)
 
-  proc addString(s: string)  = args.add(newStrLitNode(s))
-  proc addExpr(e: expr)      = args.add(e)
-  proc addDollar()           = args.add(newStrLitNode"$")
+  proc addString(s: string)    = args.add(newStrLitNode(s))
+  proc addExpr(e: PNimrodNode) = args.add(e)
+  proc addDollar()             = args.add(newStrLitNode"$")
 
   ProcessInterpolations(e)
 
diff --git a/tests/run/tusingstatement.nim b/tests/run/tusingstatement.nim
index 0017af556..ff81684a1 100644
--- a/tests/run/tusingstatement.nim
+++ b/tests/run/tusingstatement.nim
@@ -26,7 +26,7 @@ import
 #  `opened` here could be an overloaded proc which any type can define.
 #  A common practice can be returing an Optional[Resource] obj for which
 #  `opened` is defined to `optional.hasValue`
-macro using(e: expr) : stmt =
+macro using(e: expr): stmt =
   if e.len != 2:
     error "Using statement: unexpected number of arguments. Got " &
       $e.len & ", expected: 1 or more variable assignments and a block"
@@ -81,7 +81,7 @@ macro using(e: expr) : stmt =
   targetAst[0][1][1][0] = body
   targetAst[0][1][1][1][0] = finallyBlock
   
-  return targetAst
+  result = targetAst
 
 type 
   TResource* = object
diff --git a/tools/niminst/niminst.nim b/tools/niminst/niminst.nim
index 5059d3bba..9927d5bcd 100755
--- a/tools/niminst/niminst.nim
+++ b/tools/niminst/niminst.nim
@@ -391,7 +391,7 @@ proc srcdist(c: var TConfigData) =
       if existsDir(dir): removeDir(dir)
       createDir(dir)
       var cmd = ("nimrod compile -f --symbolfiles:off --compileonly " &
-                 "--gen_mapping " &
+                 "--gen_mapping --cc:gcc" &
                  " --os:$# --cpu:$# $# $#") %
                  [c.oses[osA-1], c.cpus[cpuA-1], c.nimrodArgs,
                  changeFileExt(c.infile, "nim")]