diff options
author | Araq <rumpf_a@web.de> | 2020-03-16 12:54:31 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2020-03-16 14:55:58 +0100 |
commit | a102eb5ef653a71e4286312ff9027d37b814a2f6 (patch) | |
tree | 3a256641fff243180c911f4b46d2e2bd7e8d2e1a | |
parent | 3a6b4704122f84f9cf1d9cc227f303d2eee3bc66 (diff) | |
download | Nim-a102eb5ef653a71e4286312ff9027d37b814a2f6.tar.gz |
fixes #13646
-rw-r--r-- | compiler/semexprs.nim | 12 | ||||
-rw-r--r-- | compiler/semtypinst.nim | 3 | ||||
-rw-r--r-- | tests/metatype/tmetatype_various.nim | 25 |
3 files changed, 34 insertions, 6 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index f75642bcb..a479327be 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -232,13 +232,14 @@ proc semConv(c: PContext, n: PNode): PNode = result = newNodeI(nkConv, n.info) var targetType = semTypeNode(c, n[0], nil) - if targetType.kind == tyTypeDesc: + case targetType.kind + of tyTypeDesc: internalAssert c.config, targetType.len > 0 if targetType.base.kind == tyNone: return semTypeOf(c, n) else: targetType = targetType.base - elif targetType.kind == tyStatic: + of tyStatic: var evaluated = semStaticExpr(c, n[1]) if evaluated.kind == nkType or evaluated.typ.kind == tyTypeDesc: result = n @@ -248,6 +249,7 @@ proc semConv(c: PContext, n: PNode): PNode = return evaluated else: targetType = targetType.base + else: discard maybeLiftType(targetType, c, n[0].info) @@ -268,7 +270,7 @@ proc semConv(c: PContext, n: PNode): PNode = targetType.skipTypes(abstractPtrs).kind == tyObject: localError(c.config, n.info, "object construction uses ':', not '='") var op = semExprWithType(c, n[1]) - if targetType.isMetaType: + if targetType.kind != tyGenericParam and targetType.isMetaType: let final = inferWithMetatype(c, targetType, op, true) result.add final result.typ = final.typ @@ -279,6 +281,10 @@ proc semConv(c: PContext, n: PNode): PNode = # here or needs to be overwritten too then. result.add op + if targetType.kind == tyGenericParam: + result.typ = makeTypeFromExpr(c, copyTree(result)) + return result + if not isSymChoice(op): let status = checkConvertible(c, result.typ, op) case status diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index d3ab9d866..5aec3eed9 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -618,6 +618,9 @@ proc replaceTypeVarsTAux(cl: var TReplTypeVars, t: PType): PType = eraseVoidParams(result) skipIntLiteralParams(result) + of tyRange: + result[0] = result[0].skipTypes({tyStatic, tyDistinct}) + else: discard else: # If this type doesn't refer to a generic type we may still want to run it diff --git a/tests/metatype/tmetatype_various.nim b/tests/metatype/tmetatype_various.nim index a56eca018..0dd948293 100644 --- a/tests/metatype/tmetatype_various.nim +++ b/tests/metatype/tmetatype_various.nim @@ -1,4 +1,7 @@ - +discard """ + output: '''[1, 0, 0, 0, 0, 0, 0, 0] + CTBool[Ct[system.uint32]]''' +""" block tconstraints: proc myGenericProc[T: object|tuple|int|ptr|ref|distinct](x: T): string = @@ -37,13 +40,29 @@ block tfieldaccessor: block tprocbothmeta: proc myFun[A](x: A): auto = result = float(x+10) - + proc myMap[T,S](sIn: seq[T], f: proc (q: T): S): seq[S] = result = newSeq[S](sIn.len) for i in 0..<sIn.len: result[i] = f(sIn[i]) - + assert myMap(@[1,2,3], myFun) == @[11.0, 12.0, 13.0] +# https://github.com/nim-lang/Nim/issues/13646 + +type + BaseUint* = SomeUnsignedInt or byte + Ct*[T] = distinct T + ## Constant-Time wrapper + ## Only constant-time operations in particular the ternary operator equivalent + ## condition: if true: a else: b + ## are allowed + + CTBool*[T] = distinct range[T(0)..T(1)] + ## Constant-Time boolean wrapper + +var x: array[8, CTBool[Ct[uint32]]] +x[0] = (CTBool[Ct[uint32]])(1) +echo x.repr, " ", typeof(x[0]) |