123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- discard """
- output: '''not a var
- not a var
- a var
- B
- int
- T
- int16
- T
- ref T
- 123
- 2
- 1
- @[123, 2, 1]
- Called!
- merge with var
- merge no var'''
- """
- # Things that's even in the spec now!
- proc byvar(x: var int) = echo "a var"
- proc byvar(x: int) = echo "not a var"
- byvar(89)
- let letSym = 0
- var varSym = 13
- byvar(letSym)
- byvar(varSym)
- type
- A = object of RootObj
- B = object of A
- C = object of B
- proc p(obj: A) =
- echo "A"
- proc p(obj: B) =
- echo "B"
- var c = C()
- # not ambiguous, calls 'B', not 'A' since B is a subtype of A
- # but not vice versa:
- p(c)
- proc pp(obj: A, obj2: B) = echo "A B"
- proc pp(obj: B, obj2: A) = echo "B A"
- # but this is ambiguous:
- #pp(c, c)
- proc takesInt(x: int) = echo "int"
- proc takesInt[T](x: T) = echo "T"
- proc takesInt(x: int16) = echo "int16"
- takesInt(4) # "int"
- var x: int32
- takesInt(x) # "T"
- var y: int16
- takesInt(y) # "int16"
- var z: range[0..4] = 0
- takesInt(z) # "T"
- proc gen[T](x: ref ref T) = echo "ref ref T"
- proc gen[T](x: ref T) = echo "ref T"
- proc gen[T](x: T) = echo "T"
- var ri: ref int
- gen(ri) # "ref T"
- template rem(x) = discard
- #proc rem[T](x: T) = discard
- rem unresolvedExpression(undeclaredIdentifier)
- proc takeV[T](a: varargs[T]) =
- for x in a: echo x
- takeV([123, 2, 1]) # takeV's T is "int", not "array of int"
- echo(@[123, 2, 1])
- # bug #2600
- type
- FutureBase* = ref object of RootObj ## Untyped future.
- Future*[T] = ref object of FutureBase ## Typed future.
- value: T ## Stored value
- FutureVar*[T] = distinct Future[T]
- proc newFuture*[T](): Future[T] =
- new(result)
- proc newFutureVar*[T](): FutureVar[T] =
- result = FutureVar[T](newFuture[T]())
- proc mget*[T](future: FutureVar[T]): var T =
- Future[T](future).value
- proc reset*[T](future: FutureVar[T]) =
- echo "Called!"
- proc merge[T](x: Future[T]) = echo "merge no var"
- proc merge[T](x: var Future[T]) = echo "merge with var"
- when true:
- var foo = newFutureVar[string]()
- foo.mget() = ""
- foo.mget.add("Foobar")
- foo.reset()
- var bar = newFuture[int]()
- bar.merge # merge with var
- merge(newFuture[int]()) # merge no var
|