diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index 22f0d1db60..e7b289d77a 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -630,7 +630,10 @@ proc replaceTypeVarsTAux(cl: var TReplTypeVars, t: PType): PType = result = t # Slow path, we have some work to do - if result.n != nil and t.kind == tyObject: + if t.kind == tyRef and t.len > 0 and t[0].kind == tyObject and t[0].n != nil: + discard replaceObjBranches(cl, t[0].n) + + elif result.n != nil and t.kind == tyObject: # Invalidate the type size as we may alter its structure result.size = -1 result.n = replaceObjBranches(cl, result.n) diff --git a/tests/objects/tobject.nim b/tests/objects/tobject.nim index 34856eaefb..a79c2bdfd5 100644 --- a/tests/objects/tobject.nim +++ b/tests/objects/tobject.nim @@ -42,3 +42,23 @@ var b: TMyObj = a type InheritableFoo {.inheritable.} = ref object InheritableBar = ref object of InheritableFoo # ERROR. + +block: # bug #14698 + const N = 3 + type Foo[T] = ref object + x1: int + when N == 2: + x2: float + when N == 3: + x3: seq[int] + else: + x4: char + x4b: array[9, char] + + let t = Foo[float](x1: 1) + doAssert $(t[]) == "(x1: 1, x3: @[])" + doAssert t.sizeof == int.sizeof + type Foo1 = object + x1: int + x3: seq[int] + doAssert t[].sizeof == Foo1.sizeof