summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semtypes.nim7
-rw-r--r--tests/generics/t16639.nim21
2 files changed, 25 insertions, 3 deletions
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 2afebcda3..3eaf29755 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -777,9 +777,10 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int,
   if n == nil: return
   case n.kind
   of nkRecWhen:
+    var a = copyTree(n)
     var branch: PNode = nil   # the branch to take
-    for i in 0..<n.len:
-      var it = n[i]
+    for i in 0..<a.len:
+      var it = a[i]
       if it == nil: illFormedAst(n, c.config)
       var idx = 1
       case it.kind
@@ -805,7 +806,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int,
         semRecordNodeAux(c, it[idx], newCheck, newPos, newf, rectype, hasCaseFields)
         it[idx] = if newf.len == 1: newf[0] else: newf
     if c.inGenericContext > 0:
-      father.add n
+      father.add a
     elif branch != nil:
       semRecordNodeAux(c, branch, check, pos, father, rectype, hasCaseFields)
     elif father.kind in {nkElse, nkOfBranch}:
diff --git a/tests/generics/t16639.nim b/tests/generics/t16639.nim
new file mode 100644
index 000000000..fc00dfc34
--- /dev/null
+++ b/tests/generics/t16639.nim
@@ -0,0 +1,21 @@
+discard """
+  action: compile
+"""
+
+type Foo[T] = object
+  when true:
+    x: float
+
+type Bar = object
+  when true:
+    x: float
+
+import std/macros
+import std/assertions
+
+macro test() =
+  let a = getImpl(bindSym"Foo")[^1]
+  let b = getImpl(bindSym"Bar")[^1]
+  doAssert treeRepr(a) == treeRepr(b)
+
+test()