diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2023-07-04 23:35:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-04 23:35:25 +0200 |
commit | 86ff37fab8656f7acd08fc9c3fa237f9e022dbf4 (patch) | |
tree | a2a4823c4038d43fd6e8ada7efe2bc36c4c4e3da | |
parent | 31ba1046fc91f110117b9e1cbd28d1afb4432060 (diff) | |
download | Nim-86ff37fab8656f7acd08fc9c3fa237f9e022dbf4.tar.gz |
fixes #22138 (#22221)
-rw-r--r-- | compiler/sigmatch.nim | 9 | ||||
-rw-r--r-- | tests/lent/tlent_from_var.nim | 20 |
2 files changed, 27 insertions, 2 deletions
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index b2f52ba12..e90f1524b 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1140,7 +1140,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, let x = typeRel(c, a, f, flags + {trDontBind}) if x >= isGeneric: return isGeneric - + of tyFromExpr: if c.c.inGenericContext > 0: # generic type bodies can sometimes compile call expressions @@ -1950,7 +1950,12 @@ proc implicitConv(kind: TNodeKind, f: PType, arg: PNode, m: TCandidate, if result.typ == nil: internalError(c.graph.config, arg.info, "implicitConv") result.add c.graph.emptyNode - result.add arg + if arg.typ != nil and arg.typ.kind == tyLent: + let a = newNodeIT(nkHiddenDeref, arg.info, arg.typ[0]) + a.add arg + result.add a + else: + result.add arg proc isLValue(c: PContext; n: PNode, isOutParam = false): bool {.inline.} = let aa = isAssignable(nil, n) diff --git a/tests/lent/tlent_from_var.nim b/tests/lent/tlent_from_var.nim index 912390dc1..d61ff6dc0 100644 --- a/tests/lent/tlent_from_var.nim +++ b/tests/lent/tlent_from_var.nim @@ -30,3 +30,23 @@ let x2 = x.byLentVar let xs2 = xs.byLentVar echo xs2 + +# bug #22138 + +type Xxx = object + +type + Opt[T] = object + case oResultPrivate*: bool + of false: + discard + of true: + vResultPrivate*: T + +func value*[T: not void](self: Opt[T]): lent T {.inline.} = + self.vResultPrivate +template get*[T: not void](self: Opt[T]): T = self.value() + +method connect*( + self: Opt[(int, int)]) = + discard self.get()[0] |