mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
**TODO** - [x] fixes changelog With the new option `nimPreviewVtables`, `methods` are confined in the same module where the type of the first parameter is defined - [x] make it opt in after CI checks its feasibility ## In the following-up PRs - [ ] in the following PRs, refactor code into a more efficient one - [ ] cpp needs special treatments since it cannot embed array in light of the preceding limits: ref https://github.com/nim-lang/Nim/pull/20977#discussion_r1035528927; we can support cpp backends with vtable implementations later on the comprise that uses indirect vtable access --------- Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
98 lines
1.9 KiB
Nim
98 lines
1.9 KiB
Nim
discard """
|
|
matrix: "--multimethods:on"
|
|
output: '''
|
|
collide: unit, thing
|
|
collide: unit, thing
|
|
collide: thing, unit
|
|
collide: thing, thing
|
|
collide: unit, thing |
|
|
collide: unit, thing |
|
|
collide: thing, unit |
|
|
do nothing
|
|
'''
|
|
joinable: false
|
|
disabled: true
|
|
"""
|
|
|
|
|
|
# tmultim2
|
|
type
|
|
TThing {.inheritable.} = object
|
|
TUnit = object of TThing
|
|
x: int
|
|
TParticle = object of TThing
|
|
a, b: int
|
|
|
|
method collide(a, b: TThing) {.base, inline.} =
|
|
echo "collide: thing, thing"
|
|
|
|
method collide(a: TThing, b: TUnit) {.inline.} =
|
|
echo "collide: thing, unit"
|
|
|
|
method collide(a: TUnit, b: TThing) {.inline.} =
|
|
echo "collide: unit, thing"
|
|
|
|
proc test(a, b: TThing) {.inline.} =
|
|
collide(a, b)
|
|
|
|
proc staticCollide(a, b: TThing) {.inline.} =
|
|
procCall collide(a, b)
|
|
|
|
var
|
|
a: TThing
|
|
b, c: TUnit
|
|
collide(b, c) # ambiguous (unit, thing) or (thing, unit)? -> prefer unit, thing!
|
|
test(b, c)
|
|
collide(a, b)
|
|
staticCollide(a, b)
|
|
|
|
|
|
|
|
# tmultim6
|
|
type
|
|
Thing {.inheritable.} = object
|
|
Unit[T] = object of Thing
|
|
x: T
|
|
Particle = object of Thing
|
|
a, b: int
|
|
|
|
method collide(a, b: Thing) {.base, inline.} =
|
|
quit "to override!"
|
|
|
|
method collide[T](a: Thing, b: Unit[T]) {.inline.} =
|
|
echo "collide: thing, unit |"
|
|
|
|
method collide[T](a: Unit[T], b: Thing) {.inline.} =
|
|
echo "collide: unit, thing |"
|
|
|
|
proc test(a, b: Thing) {.inline.} =
|
|
collide(a, b)
|
|
|
|
var
|
|
aaa: Thing
|
|
bbb, ccc: Unit[string]
|
|
collide(bbb, Thing(ccc))
|
|
test(bbb, ccc)
|
|
collide(aaa, bbb)
|
|
|
|
|
|
|
|
# tmethods1
|
|
method somethin(obj: RootObj) {.base.} =
|
|
echo "do nothing"
|
|
|
|
type
|
|
TNode* {.inheritable.} = object
|
|
PNode* = ref TNode
|
|
|
|
PNodeFoo* = ref object of TNode
|
|
|
|
TSomethingElse = object
|
|
PSomethingElse = ref TSomethingElse
|
|
|
|
method foo(a: PNode, b: PSomethingElse) {.base.} = discard
|
|
method foo(a: PNodeFoo, b: PSomethingElse) = discard
|
|
|
|
var o: RootObj
|
|
o.somethin()
|