summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJason Beetham <beefers331@gmail.com>2021-09-16 00:48:58 -0600
committerGitHub <noreply@github.com>2021-09-16 08:48:58 +0200
commitf8e185fec0d8f9caddc196a713fba196b14f8b6b (patch)
tree1aa7e0d688912b6fbc2b4ea6b7079e88a412f1b1
parentcebf7cdc1ede7385e8d774b83c52d17e7021899b (diff)
downloadNim-f8e185fec0d8f9caddc196a713fba196b14f8b6b.tar.gz
Fixed borrowing dot from aliases (#18854)
-rw-r--r--compiler/semexprs.nim4
-rw-r--r--tests/borrow/tborrow.nim38
2 files changed, 39 insertions, 3 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index ebdfe02f0..5a1426f2b 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1280,7 +1280,7 @@ proc semSym(c: PContext, n: PNode, sym: PSym, flags: TExprFlags): PNode =
     if p != nil and p.selfSym != nil:
       var ty = skipTypes(p.selfSym.typ, {tyGenericInst, tyVar, tyLent, tyPtr, tyRef,
                                          tyAlias, tySink, tyOwned})
-      while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst})
+      while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst, tyAlias})
       var check: PNode = nil
       if ty.kind == tyObject:
         while true:
@@ -1412,7 +1412,7 @@ proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
   if ty.kind in tyUserTypeClasses and ty.isResolvedUserTypeClass:
     ty = ty.lastSon
   ty = skipTypes(ty, {tyGenericInst, tyVar, tyLent, tyPtr, tyRef, tyOwned, tyAlias, tySink})
-  while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst})
+  while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst, tyAlias})
   var check: PNode = nil
   if ty.kind == tyObject:
     while true:
diff --git a/tests/borrow/tborrow.nim b/tests/borrow/tborrow.nim
index 2fc788fa0..35652e2e0 100644
--- a/tests/borrow/tborrow.nim
+++ b/tests/borrow/tborrow.nim
@@ -52,4 +52,40 @@ block: #14449
   c.foo = 42
   assert a.foo == 300
   assert b.foo == 400d
-  assert c.foo == 42d
\ No newline at end of file
+  assert c.foo == 42d
+
+block: # Borrow from muliple aliasses #16666
+  type
+    AImpl = object
+      i: int
+    
+    A = AImpl
+  
+    B {.borrow: `.`.} = distinct A
+    C = B
+    D {.borrow: `.`.} = distinct C
+    E {.borrow: `.`.} = distinct D
+  
+  let
+    b = default(B)
+    d = default(D)
+    e = default(E)
+  
+  assert b.i == 0
+  assert d.i == 0
+  assert e.i == 0
+
+block: # Borrow from generic alias
+  type
+    AImpl[T] = object
+      i: T
+    B[T] = AImpl[T]
+    C {.borrow: `.`.} = distinct B[int]
+    D = B[float]
+    E {.borrow: `.`.} = distinct D
+
+  let
+    c = default(C)
+    e = default(E)
+  assert c.i == int(0)
+  assert e.i == 0d
\ No newline at end of file