summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/rst.nim8
-rwxr-xr-xcompiler/semexprs.nim30
-rwxr-xr-xdoc/lib.txt2
-rw-r--r--tests/compile/tbindoverload.nim12
-rwxr-xr-xweb/community.txt2
-rwxr-xr-xweb/index.txt23
6 files changed, 51 insertions, 26 deletions
diff --git a/compiler/rst.nim b/compiler/rst.nim
index d9e4e7ec9..5cb9c3b6a 100755
--- a/compiler/rst.nim
+++ b/compiler/rst.nim
@@ -118,6 +118,8 @@ const
     ":shock:": "icon_eek",
     ":?": "icon_e_confused",
     ":-?": "icon_e_confused",
+    ":-/": "icon_e_confused",
+
     "8-)": "icon_cool",
 
     ":lol:": "icon_lol",
@@ -429,9 +431,11 @@ proc setSub(p: var TRstParser, key: string, value: PRstNode) =
 proc setRef(p: var TRstParser, key: string, value: PRstNode) = 
   var length = len(p.s.refs)
   for i in countup(0, length - 1): 
-    if key == p.s.refs[i].key: 
+    if key == p.s.refs[i].key:
+      if p.s.refs[i].value.addNodes != value.addNodes:
+        rstMessage(p, warnRedefinitionOfLabel, key)
+
       p.s.refs[i].value = value
-      rstMessage(p, warnRedefinitionOfLabel, key)
       return 
   setlen(p.s.refs, length + 1)
   p.s.refs[length].key = key
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index d2a19cb86..4e9afd585 100755
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -749,11 +749,14 @@ proc makeDeref(n: PNode): PNode =
 
 proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
   ## returns nil if it's not a built-in field access
+  checkSonsLen(n, 2)
+  # early exit for this; see tests/compile/tbindoverload.nim:
+  if n.sons[1].kind == nkSymChoice: return
+
   var s = qualifiedLookup(c, n, {checkAmbiguity, checkUndeclared})
   if s != nil:
     return semSym(c, n, s, flags)
 
-  checkSonsLen(n, 2)
   n.sons[0] = semExprWithType(c, n.sons[0], flags)
   restoreOldStyleType(n.sons[0])
   var i = considerAcc(n.sons[1])
@@ -830,18 +833,23 @@ proc semFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
   # in Nimrod. We first allow types in the semantic checking.
   result = builtinFieldAccess(c, n, flags)
   if result == nil:
-    var i = considerAcc(n.sons[1])
-    var f = SymTabGet(c.tab, i)
-    # if f != nil and f.kind == skStub: loadStub(f)
-    # ``loadStub`` is not correct here as we don't care for ``f`` really
-    if f != nil: 
-      # BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here
-      # This special node kind is to merge with the call handler in `semExpr`.
+    if n.sons[1].kind == nkSymChoice: 
       result = newNodeI(nkDotCall, n.info)
-      addSon(result, newIdentNode(i, n.info))
+      addSon(result, n.sons[1])
       addSon(result, copyTree(n[0]))
-    else: 
-      GlobalError(n.Info, errUndeclaredFieldX, i.s)
+    else:
+      var i = considerAcc(n.sons[1])
+      var f = SymTabGet(c.tab, i)
+      # if f != nil and f.kind == skStub: loadStub(f)
+      # ``loadStub`` is not correct here as we don't care for ``f`` really
+      if f != nil: 
+        # BUGFIX: do not check for (f.kind in [skProc, skMethod, skIterator]) here
+        # This special node kind is to merge with the call handler in `semExpr`.
+        result = newNodeI(nkDotCall, n.info)
+        addSon(result, newIdentNode(i, n.info))
+        addSon(result, copyTree(n[0]))
+      else: 
+        GlobalError(n.Info, errUndeclaredFieldX, i.s)
 
 proc buildOverloadedSubscripts(n: PNode, ident: PIdent): PNode =
   result = newNodeI(nkCall, n.info)
diff --git a/doc/lib.txt b/doc/lib.txt
index 3f2e3e0c3..37c66a3b7 100755
--- a/doc/lib.txt
+++ b/doc/lib.txt
@@ -608,4 +608,4 @@ Scientific computing
 --------------------
 
 * `libsvm <libsvm.html>`_ 
-  Low level wrapper for `libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_.
+  Low level wrapper for `lib svm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>`_.
diff --git a/tests/compile/tbindoverload.nim b/tests/compile/tbindoverload.nim
new file mode 100644
index 000000000..6f5bb339e
--- /dev/null
+++ b/tests/compile/tbindoverload.nim
@@ -0,0 +1,12 @@
+import strtabs
+
+template t*() =
+  block:
+    bind newStringTable
+    discard {"Content-Type": "text/html"}.newStringTable()
+
+    discard {:}.newStringTable
+
+#discard {"Content-Type": "text/html"}.newStringTable()
+
+t()
diff --git a/web/community.txt b/web/community.txt
index 7881cd5dc..99338d084 100755
--- a/web/community.txt
+++ b/web/community.txt
@@ -1,4 +1,4 @@
-Discuss Nimrod in our `forum <http://force7.de/heimdall>`_. 
+Discuss Nimrod in our `forum <http://forum.nimrod-code.org/>`_. 
 
 Visit our project page at GitHub: http://github.com/Araq/Nimrod.
 
diff --git a/web/index.txt b/web/index.txt
index e9172c155..def04048e 100755
--- a/web/index.txt
+++ b/web/index.txt
@@ -14,16 +14,6 @@ power with Python's readability and C's performance.**
 Welcome to Nimrod
 -----------------
 
-.. container:: snippet
-  *Nimrod looks like this:*
-  
-  .. code-block:: nimrod
-    import strutils
-    
-    echo "List of ints (separate by whitespace): "
-    echo stdin.readLine.split.each(parseInt).max, 
-      " is the maximum"
-
 **Nimrod** is a new statically typed, imperative
 programming language, that supports procedural, object oriented, functional 
 and generic programming styles while remaining simple and efficient. 
@@ -37,6 +27,17 @@ focuses on the 3E: efficiency, expressiveness, elegance (in the order of
 priority).
 
 
+.. container:: snippet
+  *Nimrod looks like this:*
+  
+  .. code-block:: nimrod
+    import strutils
+    
+    echo "Type in a list of ints of ints (separate by whitespace): "
+    let tokens = stdin.readLine.split
+    echo tokens.each(parseInt).max, " is the maximum."
+
+
 Nimrod is efficient
 ===================
 
@@ -67,7 +68,7 @@ Nimrod is expressive
 * Modern type system with local type inference, tuples, variants, 
   generics, etc.
 * User-defineable operators; code with new operators is often easier to read
-  than code which overloads built-in operators. In the code snippet, the 
+  than code which overloads built-in operators. For example, a 
   ``=~`` operator is defined in the ``re`` module.
 * Macros can modify the abstract syntax tree at compile time.