summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2014-03-09 23:38:17 +0200
committerZahary Karadjov <zahary@gmail.com>2014-03-09 23:38:17 +0200
commit45a345e93da9d80d5a7f2aaa5903e9f75c0bf2d6 (patch)
tree2e5df18c8b5a66a2c7c606444cac609c9c688a68 /compiler
parent3dcf735482bed528f80614dca7a096f5e1a3aaa4 (diff)
downloadNim-45a345e93da9d80d5a7f2aaa5903e9f75c0bf2d6.tar.gz
fix #866; generic static params
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ast.nim4
-rw-r--r--compiler/astalgo.nim8
-rw-r--r--compiler/guards.nim4
-rw-r--r--compiler/semtypes.nim35
4 files changed, 33 insertions, 18 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 9c9dfce9a..f9cab0d88 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -818,6 +818,9 @@ type
     counter*: int
     data*: TObjectSeq
 
+  TImplication* = enum
+    impUnknown, impNo, impYes
+
 # BUGFIX: a module is overloadable so that a proc can have the
 # same name as an imported module. This is necessary because of
 # the poor naming choices in the standard library.
@@ -865,6 +868,7 @@ const
   nkCallKinds* = {nkCall, nkInfix, nkPrefix, nkPostfix,
                   nkCommand, nkCallStrLit, nkHiddenCallConv}
 
+  nkLiterals* = {nkCharLit..nkTripleStrLit}
   nkLambdaKinds* = {nkLambda, nkDo}
   declarativeDefs* = {nkProcDef, nkMethodDef, nkIteratorDef, nkConverterDef}
   procDefs* = nkLambdaKinds + declarativeDefs
diff --git a/compiler/astalgo.nim b/compiler/astalgo.nim
index cce2cc215..36dd7f562 100644
--- a/compiler/astalgo.nim
+++ b/compiler/astalgo.nim
@@ -50,7 +50,7 @@ proc strTableGet*(t: TStrTable, name: PIdent): PSym
 type 
   TTabIter*{.final.} = object # consider all fields here private
     h*: THash                 # current hash
-  
+
 proc initTabIter*(ti: var TTabIter, tab: TStrTable): PSym
 proc nextIter*(ti: var TTabIter, tab: TStrTable): PSym
   # usage:
@@ -157,6 +157,12 @@ proc leValue*(a, b: PNode): bool =
     #InternalError(a.info, "leValue")
     discard
 
+proc weakLeValue*(a, b: PNode): TImplication =
+  if a.kind notin nkLiterals or b.kind notin nkLiterals:
+    result = impUnknown
+  else:
+    result = if leValue(a, b): impYes else: impNo
+
 proc lookupInRecord(n: PNode, field: PIdent): PSym = 
   result = nil
   case n.kind
diff --git a/compiler/guards.nim b/compiler/guards.nim
index fe868054f..f475f5068 100644
--- a/compiler/guards.nim
+++ b/compiler/guards.nim
@@ -274,10 +274,6 @@ proc pred(n: PNode): PNode =
   else:
     result = n
 
-type
-  TImplication* = enum
-    impUnknown, impNo, impYes  
-
 proc impliesEq(fact, eq: PNode): TImplication =
   let (loc, val) = if isLocation(eq.sons[1]): (1, 2) else: (2, 1)
   
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 299a3a9b9..c441c3c44 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -147,26 +147,35 @@ proc semDistinct(c: PContext, n: PNode, prev: PType): PType =
   else:
     result = newConstraint(c, tyDistinct)
   
-proc semRangeAux(c: PContext, n: PNode, prev: PType): PType = 
+proc semRangeAux(c: PContext, n: PNode, prev: PType): PType =
   assert isRange(n)
   checkSonsLen(n, 3)
   result = newOrPrevType(tyRange, prev, c)
   result.n = newNodeI(nkRange, n.info)
-  if (n[1].kind == nkEmpty) or (n[2].kind == nkEmpty): 
+  if (n[1].kind == nkEmpty) or (n[2].kind == nkEmpty):
     localError(n.info, errRangeIsEmpty)
-  var a = semConstExpr(c, n[1])
-  var b = semConstExpr(c, n[2])
-  if not sameType(a.typ, b.typ):
+  
+  var imm: array[2, PNode]
+  imm[0] = semExprWithType(c, n[1], {efDetermineType})
+  imm[1] = semExprWithType(c, n[2], {efDetermineType})
+  
+  if not sameType(imm[0].typ, imm[1].typ):
     localError(n.info, errPureTypeMismatch)
-  elif a.typ.kind notin {tyInt..tyInt64,tyEnum,tyBool,tyChar,
-                         tyFloat..tyFloat128,tyUInt8..tyUInt32}:
+  elif not imm[0].typ.isOrdinalType:
     localError(n.info, errOrdinalTypeExpected)
-  elif enumHasHoles(a.typ): 
-    localError(n.info, errEnumXHasHoles, a.typ.sym.name.s)
-  elif not leValue(a, b): localError(n.info, errRangeIsEmpty)
-  addSon(result.n, a)
-  addSon(result.n, b)
-  addSonSkipIntLit(result, b.typ)
+  elif enumHasHoles(imm[0].typ):
+    localError(n.info, errEnumXHasHoles, imm[0].typ.sym.name.s)
+  
+  for i in 0..1:
+    if hasGenericArguments(imm[i]):
+      result.n.addSon makeStaticExpr(c, imm[i])
+    else:
+      result.n.addSon semConstExpr(c, imm[i])
+ 
+  if weakLeValue(result.n[0], result.n[1]) == impNo:
+    localError(n.info, errRangeIsEmpty)
+
+  addSonSkipIntLit(result, imm[0].typ)
 
 proc semRange(c: PContext, n: PNode, prev: PType): PType =
   result = nil