mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
52 lines
834 B
Nim
52 lines
834 B
Nim
discard """
|
|
output: '''works'''
|
|
"""
|
|
|
|
# bug #11095
|
|
|
|
type
|
|
MyVal[T] = object
|
|
f: ptr T
|
|
|
|
proc `=destroy`[T](x: var MyVal[T]) =
|
|
if x.f != nil:
|
|
dealloc(x.f)
|
|
|
|
proc `=sink`[T](x1: var MyVal[T], x2: MyVal[T]) =
|
|
if x1.f != x2.f:
|
|
`=destroy`(x1)
|
|
x1.f = x2.f
|
|
|
|
proc `=`[T](x1: var MyVal[T], x2: MyVal[T]) {.error.}
|
|
|
|
proc newVal[T](x: sink T): MyVal[T] =
|
|
result.f = create(T)
|
|
result.f[] = x
|
|
|
|
proc set[T](x: var MyVal[T], val: T) =
|
|
x.f[] = val
|
|
|
|
proc sinkMe[T](x: sink MyVal[T]) =
|
|
discard
|
|
|
|
var flag = false
|
|
|
|
proc main =
|
|
var y = case flag
|
|
of true:
|
|
var x1 = newVal[float](1.0)
|
|
var x2 = newVal[float](2.0)
|
|
(newVal(x1), newVal(x2))
|
|
|
|
of false:
|
|
var x1 = newVal[float](1.0)
|
|
var x2 = newVal[float](2.0)
|
|
(newVal(x1), newVal(x2))
|
|
|
|
sinkMe y[0]
|
|
sinkMe y[1]
|
|
echo "works"
|
|
|
|
main()
|
|
|