talias.nim 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # Test the alias analysis
  2. type
  3. TAnalysisResult* = enum
  4. arNo, arMaybe, arYes
  5. proc isPartOf*[S, T](a: S, b: T): TAnalysisResult {.
  6. magic: "IsPartOf", noSideEffect.}
  7. ## not yet exported properly.
  8. template compileTimeAssert(cond) =
  9. when not cond:
  10. {.compile: "is false: " & astToStr(cond).}
  11. template `<|` (a, b) =
  12. compileTimeAssert isPartOf(a, b) == arYes
  13. template `!<|` (a, b) =
  14. compileTimeAssert isPartOf(a, b) == arNo
  15. template `?<|` (a, b) =
  16. compileTimeAssert isPartOf(a, b) == arMaybe
  17. type
  18. TA {.inheritable.} = object
  19. TC = object of TA
  20. arr: array[0..3, int]
  21. le, ri: ref TC
  22. f: string
  23. c: char
  24. se: seq[TA]
  25. proc p(param1, param2: TC, param3: var TC): TC =
  26. result = TC()
  27. var
  28. local: TC = default(TC)
  29. plocal: ptr TC = nil
  30. plocal2: ptr TA = nil
  31. local.arr <| local
  32. local.arr[0] <| local
  33. local.arr[2] !<| local.arr[1]
  34. plocal2[] ?<| local
  35. param1 ?<| param2
  36. local ?<| param3
  37. local.arr[0] !<| param1
  38. local.arr !<| param1
  39. local.le[] ?<| param1
  40. param1 !<| local.arr[0]
  41. param1 !<| local.arr
  42. param1 ?<| local.le[]
  43. result !<| local
  44. result <| result
  45. var
  46. a, b: int
  47. x: TC
  48. a <| a
  49. a !<| b
  50. discard p(x, x, x)