summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJason Beetham <beefers331@gmail.com>2021-09-14 11:34:52 -0600
committerGitHub <noreply@github.com>2021-09-14 19:34:52 +0200
commit172253cb551a475d7d32093e562521990e71a1ed (patch)
tree34fb74e45d9d09a4a700ce274a3476b406e48fbe
parentef390e6a68db74a61137d7690dd2b10ec3dee050 (diff)
downloadNim-172253cb551a475d7d32093e562521990e71a1ed.tar.gz
Dotborrow now works with generic distincts (#18848)
-rw-r--r--compiler/semexprs.nim4
-rw-r--r--compiler/semstmts.nim3
-rw-r--r--tests/borrow/tborrow.nim20
-rw-r--r--tests/borrow/tinvalidborrow.nim17
4 files changed, 37 insertions, 7 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 41381b057..ebdfe02f0 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})
+      while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst})
       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})
+  while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct, tyGenericInst})
   var check: PNode = nil
   if ty.kind == tyObject:
     while true:
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 364444c98..c2f05ccce 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -1296,7 +1296,8 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) =
         incl a[2].flags, nfSem # bug #10548
     if sfExportc in s.flags and s.typ.kind == tyAlias:
       localError(c.config, name.info, "{.exportc.} not allowed for type aliases")
-    if tfBorrowDot in s.typ.flags and s.typ.kind != tyDistinct:
+
+    if tfBorrowDot in s.typ.flags and s.typ.skipTypes({tyGenericBody}).kind != tyDistinct:
       excl s.typ.flags, tfBorrowDot
       localError(c.config, name.info, "only a 'distinct' type can borrow `.`")
     let aa = a[2]
diff --git a/tests/borrow/tborrow.nim b/tests/borrow/tborrow.nim
index 9c403021e..2fc788fa0 100644
--- a/tests/borrow/tborrow.nim
+++ b/tests/borrow/tborrow.nim
@@ -33,3 +33,23 @@ let b = Radians(1.0)
 a -= b
 
 echo a.float64
+
+block: #14449
+  type 
+    Foo[T] = object
+      foo: T
+
+    Bar[T] {.borrow:`.`.} = distinct Foo[T]
+    SomeThing {.borrow:`.`.} = distinct Foo[float]
+    OtherThing {.borrow:`.`.} = distinct SomeThing
+
+  var
+    a: Bar[int]
+    b: SomeThing
+    c: OtherThing
+  a.foo = 300
+  b.foo = 400
+  c.foo = 42
+  assert a.foo == 300
+  assert b.foo == 400d
+  assert c.foo == 42d
\ No newline at end of file
diff --git a/tests/borrow/tinvalidborrow.nim b/tests/borrow/tinvalidborrow.nim
index 89aa4e2e8..08148608d 100644
--- a/tests/borrow/tinvalidborrow.nim
+++ b/tests/borrow/tinvalidborrow.nim
@@ -1,16 +1,25 @@
 discard """
-  errormsg: "no symbol to borrow from found"
-  line: 11
+  cmd: "nim check --hints:off --warnings:off $file"
+  action: "reject"
+  nimout:'''
+tinvalidborrow.nim(18, 3) Error: only a 'distinct' type can borrow `.`
+tinvalidborrow.nim(19, 3) Error: only a 'distinct' type can borrow `.`
+tinvalidborrow.nim(20, 1) Error: no symbol to borrow from found
+'''
 """
 
 # bug #516
 
 type
   TAtom = culong
-
+  Test {.borrow:`.`.} = distinct int
+  Foo[T] = object
+    a: int
+  Bar[T] {.borrow:`.`.} = Foo[T]
+  OtherFoo {.borrow:`.`.} = Foo[int]
 proc `==`*(a, b: TAtom): bool {.borrow.}
 
 var
   d, e: TAtom
 
-echo( $(d == e) )
+discard( $(d == e) )