diff options
author | Zahary Karadjov <zahary@gmail.com> | 2017-03-24 14:18:50 +0200 |
---|---|---|
committer | Zahary Karadjov <zahary@gmail.com> | 2017-03-24 17:07:30 +0200 |
commit | 7fdf29937d8cb4835953a5e52b59e5f550d0fba2 (patch) | |
tree | 544305ac9f1b3d3d68ab864fb5dcd925c3ae6e94 /compiler | |
parent | 9574d318ae1e4cf648f7384d99afadd8a2d89520 (diff) | |
download | Nim-7fdf29937d8cb4835953a5e52b59e5f550d0fba2.tar.gz |
fix tgenericshardcases
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/seminst.nim | 3 | ||||
-rw-r--r-- | compiler/semtypes.nim | 19 |
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: |