mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
fixes #24097
For `nkConv` addresses where the conversion is between 2 types that are
equal between backends, treat assignments the same as assignments to the
argument of the conversion. In the VM this seems to be in `genAsgn` and
`genAsgnPatch`, as evidenced by the special logic for `nkDerefExpr` etc.
This doesn't handle ranges after #24037 because `sameBackendType` is
used and not `sameBackendTypeIgnoreRange`. This is so this is
backportable without #24037 and another PR can be opened that implements
it for ranges and adds tests as well. We can also merge
`sameBackendTypeIgnoreRange` with `sameBackendType` since it doesn't
seem like anything that uses it would be affected (only cycle checks and
the VM), but then we still have to add tests.
(cherry picked from commit 1fbb67ffe9)
50 lines
1.2 KiB
Nim
50 lines
1.2 KiB
Nim
block: # issue #24097
|
|
type Foo = distinct int
|
|
proc foo(x: var Foo) =
|
|
int(x) += 1
|
|
proc bar(x: var int) =
|
|
x += 1
|
|
static:
|
|
var x = Foo(1)
|
|
int(x) = int(x) + 1
|
|
doAssert x.int == 2
|
|
int(x) += 1
|
|
doAssert x.int == 3
|
|
foo(x)
|
|
doAssert x.int == 4
|
|
bar(int(x)) # need vmgen flags propagated for this
|
|
doAssert x.int == 5
|
|
type Bar = object
|
|
x: Foo
|
|
static:
|
|
var obj = Bar(x: Foo(1))
|
|
int(obj.x) = int(obj.x) + 1
|
|
doAssert obj.x.int == 2
|
|
int(obj.x) += 1
|
|
doAssert obj.x.int == 3
|
|
foo(obj.x)
|
|
doAssert obj.x.int == 4
|
|
bar(int(obj.x)) # need vmgen flags propagated for this
|
|
doAssert obj.x.int == 5
|
|
static:
|
|
var arr = @[Foo(1)]
|
|
int(arr[0]) = int(arr[0]) + 1
|
|
doAssert arr[0].int == 2
|
|
int(arr[0]) += 1
|
|
doAssert arr[0].int == 3
|
|
foo(arr[0])
|
|
doAssert arr[0].int == 4
|
|
bar(int(arr[0])) # need vmgen flags propagated for this
|
|
doAssert arr[0].int == 5
|
|
proc testResult(): Foo =
|
|
result = Foo(1)
|
|
int(result) = int(result) + 1
|
|
doAssert result.int == 2
|
|
int(result) += 1
|
|
doAssert result.int == 3
|
|
foo(result)
|
|
doAssert result.int == 4
|
|
bar(int(result)) # need vmgen flags propagated for this
|
|
doAssert result.int == 5
|
|
doAssert testResult().int == 5
|