summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2017-03-24 14:18:50 +0200
committerZahary Karadjov <zahary@gmail.com>2017-03-24 17:07:30 +0200
commit7fdf29937d8cb4835953a5e52b59e5f550d0fba2 (patch)
tree544305ac9f1b3d3d68ab864fb5dcd925c3ae6e94 /compiler
parent9574d318ae1e4cf648f7384d99afadd8a2d89520 (diff)
downloadNim-7fdf29937d8cb4835953a5e52b59e5f550d0fba2.tar.gz
fix tgenericshardcases
Diffstat (limited to 'compiler')
-rw-r--r--compiler/seminst.nim3
-rw-r--r--compiler/semtypes.nim19
2 files changed, 14 insertions, 8 deletions
diff --git a/compiler/seminst.nim b/compiler/seminst.nim
index 71752f5c3..874be8dd6 100644
--- a/compiler/seminst.nim
+++ b/compiler/seminst.nim
@@ -304,7 +304,8 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
       pragma(c, result, n.sons[pragmasPos], allRoutinePragmas)
     if isNil(n.sons[bodyPos]):
       n.sons[bodyPos] = copyTree(fn.getBody)
-    instantiateBody(c, n, fn.typ.n, result, fn)
+    if c.inGenericContext == 0:
+      instantiateBody(c, n, fn.typ.n, result, fn)
     sideEffectsCheck(c, result)
     paramsTypeCheck(c, result.typ)
   else:
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 42ffaa5fa..02166f0aa 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -185,12 +185,16 @@ proc semRangeAux(c: PContext, n: PNode, prev: PType): PType =
   for i in 0..1:
     rangeT[i] = range[i].typ.skipTypes({tyStatic}).skipIntLit
 
-  if not sameType(rangeT[0].skipTypes({tyRange}), rangeT[1].skipTypes({tyRange})):
-    localError(n.info, errPureTypeMismatch)
-  elif not rangeT[0].isOrdinalType:
-    localError(n.info, errOrdinalTypeExpected)
-  elif enumHasHoles(rangeT[0]):
-    localError(n.info, errEnumXHasHoles, rangeT[0].sym.name.s)
+  let hasUnknownTypes = c.inGenericContext > 0 and
+    rangeT[0].kind == tyFromExpr or rangeT[1].kind == tyFromExpr
+
+  if not hasUnknownTypes:
+    if not sameType(rangeT[0].skipTypes({tyRange}), rangeT[1].skipTypes({tyRange})):
+      localError(n.info, errPureTypeMismatch)
+    elif not rangeT[0].isOrdinalType:
+      localError(n.info, errOrdinalTypeExpected)
+    elif enumHasHoles(rangeT[0]):
+      localError(n.info, errEnumXHasHoles, rangeT[0].sym.name.s)
 
   for i in 0..1:
     if hasGenericArguments(range[i]):
@@ -228,7 +232,8 @@ proc semRange(c: PContext, n: PNode, prev: PType): PType =
     result = newOrPrevType(tyError, prev, c)
 
 proc semArrayIndex(c: PContext, n: PNode): PType =
-  if isRange(n): result = semRangeAux(c, n, nil)
+  if isRange(n):
+    result = semRangeAux(c, n, nil)
   else:
     let e = semExprWithType(c, n, {efDetermineType})
     if e.typ.kind == tyFromExpr: