summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rwxr-xr-xcompiler/lexer.nim10
-rwxr-xr-xcompiler/nversion.nim2
-rwxr-xr-xcompiler/semcall.nim30
-rwxr-xr-xcompiler/seminst.nim2
-rwxr-xr-xcompiler/semstmts.nim38
5 files changed, 41 insertions, 41 deletions
diff --git a/compiler/lexer.nim b/compiler/lexer.nim
index b2932033d..2174a696f 100755
--- a/compiler/lexer.nim
+++ b/compiler/lexer.nim
@@ -267,7 +267,7 @@ proc GetNumber(L: var TLexer): TToken =
         inc(L.bufpos)
       matchUnderscoreChars(L, result, {'0'..'9'})
   endpos = L.bufpos
-  if L.buf[endpos] == '\'': 
+  if L.buf[endpos] == '\'':
     #matchUnderscoreChars(L, result, ['''', 'f', 'F', 'i', 'I', '0'..'9']);
     inc(endpos)
     L.bufpos = pos            # restore position
@@ -281,7 +281,7 @@ proc GetNumber(L: var TLexer): TToken =
         result.tokType = tkFloat32Lit
         inc(endpos, 2)
       else: 
-        lexMessage(L, errInvalidNumber, result.literal)
+        lexMessage(L, errInvalidNumber, result.literal & "'f" & L.buf[endpos])
     of 'i', 'I': 
       inc(endpos)
       if (L.buf[endpos] == '6') and (L.buf[endpos + 1] == '4'): 
@@ -297,9 +297,9 @@ proc GetNumber(L: var TLexer): TToken =
         result.tokType = tkInt8Lit
         inc(endpos)
       else: 
-        lexMessage(L, errInvalidNumber, result.literal)
-    else: lexMessage(L, errInvalidNumber, result.literal)
-  else: 
+        lexMessage(L, errInvalidNumber, result.literal & "'i" & L.buf[endpos])
+    else: lexMessage(L, errInvalidNumber, result.literal & "'" & L.buf[endpos])
+  else:
     L.bufpos = pos            # restore position
   try: 
     if (L.buf[pos] == '0') and
diff --git a/compiler/nversion.nim b/compiler/nversion.nim
index 45b804d40..0c0630dfd 100755
--- a/compiler/nversion.nim
+++ b/compiler/nversion.nim
@@ -15,6 +15,6 @@ const
   defaultAsmMarkerSymbol* = '!'
   VersionMajor* = 0
   VersionMinor* = 8
-  VersionPatch* = 12
+  VersionPatch* = 13
   VersionAsString* = $VersionMajor & "." & $VersionMinor & "." & $VersionPatch
 
diff --git a/compiler/semcall.nim b/compiler/semcall.nim
index 294c0399b..cf277728d 100755
--- a/compiler/semcall.nim
+++ b/compiler/semcall.nim
@@ -83,6 +83,13 @@ proc explicitGenericInstError(n: PNode): PNode =
   LocalError(n.info, errCannotInstantiateX, renderTree(n))
   result = n
 
+proc explicitGenericSym(c: PContext, n: PNode, s: PSym): PNode =
+  var x: TCandidate
+  initCandidate(x, s, n)
+  var newInst = generateInstance(c, s, x.bindings, n.info)
+  markUsed(n, s)
+  result = newSymNode(newInst, n.info)
+
 proc explicitGenericInstantiation(c: PContext, n: PNode, s: PSym): PNode = 
   assert n.kind == nkBracketExpr
   for i in 1..sonsLen(n)-1:
@@ -94,27 +101,30 @@ proc explicitGenericInstantiation(c: PContext, n: PNode, s: PSym): PNode =
     # number of generic type parameters:
     if safeLen(s.ast.sons[genericParamsPos]) != n.len-1:
       return explicitGenericInstError(n)
+    result = explicitGenericSym(c, n, s)
   elif a.kind == nkSymChoice:
     # choose the generic proc with the proper number of type parameters.
     # XXX I think this could be improved by reusing sigmatch.ParamTypesMatch.
     # It's good enough for now.
-    var candidateCount = 0
+    result = newNodeI(nkSymChoice, n.info)
     for i in countup(0, len(a)-1): 
       var candidate = a.sons[i].sym
       if candidate.kind in {skProc, skMethod, skConverter, skIterator}: 
         # if suffices that the candidate has the proper number of generic 
         # type parameters:
         if safeLen(candidate.ast.sons[genericParamsPos]) == n.len-1:
-          s = candidate
-          inc(candidateCount)
-    if candidateCount != 1: return explicitGenericInstError(n)
+          result.add(explicitGenericSym(c, n, candidate))
+    # get rid of nkSymChoice if not ambigious:
+    if result.len == 1: result = result[0]
+    # candidateCount != 1: return explicitGenericInstError(n)
   else:
     assert false
   
-  var x: TCandidate
-  initCandidate(x, s, n)
-  var newInst = generateInstance(c, s, x.bindings, n.info)
-  
-  markUsed(n, s)
-  result = newSymNode(newInst, n.info)
+  when false:
+    var x: TCandidate
+    initCandidate(x, s, n)
+    var newInst = generateInstance(c, s, x.bindings, n.info)
+    
+    markUsed(n, s)
+    result = newSymNode(newInst, n.info)
 
diff --git a/compiler/seminst.nim b/compiler/seminst.nim
index 2db8289f2..3d0b672bc 100755
--- a/compiler/seminst.nim
+++ b/compiler/seminst.nim
@@ -25,7 +25,7 @@ proc instantiateGenericParamList(c: PContext, n: PNode, pt: TIdTable) =
     if t == nil: 
       LocalError(a.info, errCannotInstantiateX, s.name.s)
       break
-    if (t.kind == tyGenericParam): 
+    if t.kind == tyGenericParam: 
       InternalError(a.info, "instantiateGenericParamList: " & q.name.s)
     s.typ = t
     addDecl(c, s)
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 61709ad48..a341ce64d 100755
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -152,42 +152,32 @@ proc semCase(c: PContext, n: PNode): PNode =
   closeScope(c.tab)
 
 proc SemReturn(c: PContext, n: PNode): PNode = 
-  var 
-    restype: PType
-    a: PNode                  # temporary assignment for code generator
   result = n
   checkSonsLen(n, 1)
-  if not (c.p.owner.kind in {skConverter, skMethod, skProc, skMacro}): 
+  if c.p.owner.kind notin {skConverter, skMethod, skProc, skMacro}:
     globalError(n.info, errXNotAllowedHere, "\'return\'")
-  if n.sons[0].kind != nkEmpty: 
-    n.sons[0] = SemExprWithType(c, n.sons[0]) # check for type compatibility:
-    restype = c.p.owner.typ.sons[0]
-    if restype != nil: 
-      a = newNodeI(nkAsgn, n.sons[0].info)
-      n.sons[0] = fitNode(c, restype, n.sons[0])
-      # optimize away ``return result``, because it would be transformed
-      # to ``result = result; return``:
-      if (n.sons[0].kind == nkSym) and (sfResult in n.sons[0].sym.flags): 
-        n.sons[0] = ast.emptyNode
-      else: 
-        if (c.p.resultSym == nil): InternalError(n.info, "semReturn")
-        addSon(a, semExprWithType(c, newSymNode(c.p.resultSym)))
-        addSon(a, n.sons[0])
-        n.sons[0] = a
-    else: 
-      localError(n.info, errCannotReturnExpr)
+  if n.sons[0].kind != nkEmpty:
+    # transform ``return expr`` to ``result = expr; return``
+    if c.p.resultSym == nil: InternalError(n.info, "semReturn")
+    var a = newNodeI(nkAsgn, n.sons[0].info)
+    addSon(a, newSymNode(c.p.resultSym))
+    addSon(a, n.sons[0])
+    n.sons[0] = semAsgn(c, a)
+    # optimize away ``result = result``:
+    if n[0][1].kind == nkSym and sfResult in n[0][1].sym.flags: 
+      n.sons[0] = ast.emptyNode
   
 proc SemYield(c: PContext, n: PNode): PNode = 
   result = n
   checkSonsLen(n, 1)
-  if (c.p.owner == nil) or (c.p.owner.kind != skIterator): 
+  if c.p.owner == nil or c.p.owner.kind != skIterator: 
     GlobalError(n.info, errYieldNotAllowedHere)
-  if n.sons[0].kind != nkEmpty: 
+  if n.sons[0].kind != nkEmpty:
     n.sons[0] = SemExprWithType(c, n.sons[0]) # check for type compatibility:
     var restype = c.p.owner.typ.sons[0]
     if restype != nil: 
       n.sons[0] = fitNode(c, restype, n.sons[0])
-      if (n.sons[0].typ == nil): InternalError(n.info, "semYield")
+      if n.sons[0].typ == nil: InternalError(n.info, "semYield")
     else: 
       localError(n.info, errCannotReturnExpr)