diff options
Diffstat (limited to 'compiler')
-rwxr-xr-x | compiler/rst.nim | 8 | ||||
-rwxr-xr-x | compiler/semexprs.nim | 30 |
2 files changed, 25 insertions, 13 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) |