diff options
-rwxr-xr-x | compiler/parser.nim | 2 | ||||
-rwxr-xr-x | compiler/semexprs.nim | 4 | ||||
-rwxr-xr-x | compiler/semtypes.nim | 30 | ||||
-rwxr-xr-x | examples/hallo.nim | 2 | ||||
-rwxr-xr-x | lib/core/macros.nim | 6 | ||||
-rw-r--r-- | lib/pure/unittest.nim | 4 | ||||
-rwxr-xr-x | lib/wrappers/tcl.nim | 2 | ||||
-rwxr-xr-x | tests/compile/tdumpast.nim | 2 | ||||
-rw-r--r-- | tests/run/tstringinterp.nim | 8 | ||||
-rw-r--r-- | tests/run/tusingstatement.nim | 4 | ||||
-rwxr-xr-x | tools/niminst/niminst.nim | 2 |
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")] |