Dotborrow now works with generic distincts (#18848)

This commit is contained in:
Jason Beetham
2021-09-14 11:34:52 -06:00
committed by GitHub
parent ef390e6a68
commit 172253cb55
4 changed files with 37 additions and 7 deletions

View File

@@ -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:

View File

@@ -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]

View File

@@ -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

View File

@@ -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) )