summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJason Beetham <beefers331@gmail.com>2021-09-13 01:35:19 -0600
committerGitHub <noreply@github.com>2021-09-13 09:35:19 +0200
commit3f3e0fa303a2729d0d6a9ffe54936c1c830e2d7e (patch)
treeac37b283db52feb6b6d99f15928834ab86e8c8b9
parent5d1608c9764416e74b36f6a772f16a66d58ddc28 (diff)
downloadNim-3f3e0fa303a2729d0d6a9ffe54936c1c830e2d7e.tar.gz
Fixed #18838 (#18841) [backport]
-rw-r--r--compiler/semtypinst.nim6
-rw-r--r--tests/generics/trecursivegenerics.nim36
2 files changed, 40 insertions, 2 deletions
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim
index 01b21498b..cb1ead027 100644
--- a/compiler/semtypinst.nim
+++ b/compiler/semtypinst.nim
@@ -344,7 +344,11 @@ proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType =
       x = lookupTypeVar(cl, x)
       if x != nil:
         if header == t: header = instCopyType(cl, t)
-        header[i] = x
+        header[i] =
+          if x.kind == tyGenericInst:
+            t[i]
+          else:
+            x
         propagateToOwner(header, x)
     else:
       propagateToOwner(header, x)
diff --git a/tests/generics/trecursivegenerics.nim b/tests/generics/trecursivegenerics.nim
index 56c074e3f..e4c0e720f 100644
--- a/tests/generics/trecursivegenerics.nim
+++ b/tests/generics/trecursivegenerics.nim
@@ -1,6 +1,7 @@
 block: # Replicates #18728
   type
     FlipFlop[A, B] = ref object
+      val: A
       next: FlipFlop[B, A]
   
     Trinary[A, B, C] = ref object
@@ -9,4 +10,37 @@ block: # Replicates #18728
   assert typeof(FlipFlop[int, string]().next) is FlipFlop[string, int]
   assert typeof(FlipFlop[string, int]().next) is FlipFlop[int, string]
   assert typeof(Trinary[int, float, string]().next) is Trinary[float, string, int]
-  assert typeof(Trinary[int, float, string]().next.next) is Trinary[string, int, float]
\ No newline at end of file
+  assert typeof(Trinary[int, float, string]().next.next) is Trinary[string, int, float]
+  var a = FlipFlop[int, string](val: 100, next: FlipFlop[string, int](val: "Hello"))
+  assert a.val == 100
+  assert a.next.val == "Hello"
+
+block: # 18838
+  type
+    DoublyLinkedNodeObj[T] = object
+      value: T
+
+    DoublyLinkedNode[T] = ref DoublyLinkedNodeObj[T]
+
+    Item[T] = ref object
+      link: DoublyLinkedNode[Item[T]]
+
+    Box = object
+
+  proc newDoublyLinkedNode[T](value: T): DoublyLinkedNode[T] =
+    new(result)
+    result.value = value 
+
+  let link = newDoublyLinkedNode(Item[Box]())
+
+import lists
+block:
+  type
+    Box = object
+    Item[T] = ref object
+      link:DoublyLinkedNode[ Item[T] ]
+
+    ItemSimple = ref object
+      link:DoublyLinkedNode[ ItemSimple ]
+
+  let link = newDoublyLinkedNode( Item[Box]() )
\ No newline at end of file