diff options
-rw-r--r-- | compiler/semtypinst.nim | 26 | ||||
-rw-r--r-- | tests/statictypes/tstatictypes.nim | 12 |
2 files changed, 37 insertions, 1 deletions
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index 950ec8e6b..7e4587658 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -260,12 +260,32 @@ proc replaceTypeVarsS(cl: var TReplTypeVars, s: PSym): PSym = #result = PSym(idTableGet(cl.symMap, s)) #if result == nil: + #[ + + We cannot naively check for symbol recursions, because otherwise + object types A, B whould share their fields! + + import tables + + type + Table[S, T] = object + x: S + y: T + + G[T] = object + inodes: Table[int, T] # A + rnodes: Table[T, int] # B + + var g: G[string] + + ]# result = copySym(s) incl(result.flags, sfFromGeneric) #idTablePut(cl.symMap, s, result) result.owner = s.owner result.typ = replaceTypeVarsT(cl, s.typ) - result.ast = replaceTypeVarsN(cl, s.ast) + if result.kind != skType: + result.ast = replaceTypeVarsN(cl, s.ast) proc lookupTypeVar(cl: var TReplTypeVars, t: PType): PType = result = cl.typeMap.lookup(t) @@ -685,6 +705,10 @@ proc recomputeFieldPositions*(t: PType; obj: PNode; currPosition: var int) = proc generateTypeInstance*(p: PContext, pt: TIdTable, info: TLineInfo, t: PType): PType = + # Given `t` like Foo[T] + # pt: Table with type mappings: T -> int + # Desired result: Foo[int] + # proc (x: T = 0); T -> int ----> proc (x: int = 0) var typeMap = initLayeredTypeMap(pt) var cl = initTypeVars(p, addr(typeMap), info, nil) pushInfoContext(p.config, info) diff --git a/tests/statictypes/tstatictypes.nim b/tests/statictypes/tstatictypes.nim index 2a4ab0c63..c95e499d7 100644 --- a/tests/statictypes/tstatictypes.nim +++ b/tests/statictypes/tstatictypes.nim @@ -8,6 +8,7 @@ output: ''' 16 b is 2 times a 17 +['\x00', '\x00', '\x00', '\x00'] ''' """ @@ -154,3 +155,14 @@ block: const uk = MicroKernel(a: 5.5, b: 1) tFunc[uk]() + + +# bug #7258 +type + StringValue*[LEN: static[Natural]] = array[LEN+Natural(2),char] + StringValue16* = StringValue[2] + +var + s: StringValue16 + +echo s |