Skip to content

Commit

Permalink
fix #14698 nkRecWhen caused internalAssert in semConstructFields when…
Browse files Browse the repository at this point in the history
… generic type not mentioned in fields
  • Loading branch information
timotheecour committed Jun 18, 2020
1 parent e7f280b commit e324240
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler/semtypinst.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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].n != nil:
result.n = 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)
Expand Down
20 changes: 20 additions & 0 deletions tests/objects/tobject.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit e324240

Please sign in to comment.