I have already encountered this error. As far as I remember, it occurs when you 
use "var" in a proc whereas the type is a "ref object". If you change this in 
your example, the error disappears.
    
    
    type
      Animal* = ref object of RootObj
        age*: int
    
    proc init(x: Animal) =
      x.age = 0
    
    method cry(x: Animal) {.base.} =
      echo "Animal is silent..."
    
    type Mammal* = ref object of Animal
        legs: int
    
    proc init(x: Mammal) =
      x.Animal.init()
      x.legs = 4
    
    method cry(x: Mammal) =
      echo "Mammal is crying..."
    
    type
      Dog* = ref object of Mammal
        tail: int
        ears: int
    
    proc init(x: Dog) =
      x.Mammal.init()
      x.tail = 1
      x.ears = 2
    
    proc newDog(): Dog =
      new result
      result.init
      return result
    
    method cry(x: Dog) =
      echo "Dog is barking..."
    
    proc birthsday(x: Dog) =
      inc(x.age)
    
    type
      Cat* = ref object of Mammal
        tail: int
        ears: int
        angry: bool
    
    proc init(x: Cat) =
      x.Mammal.init()
      x.tail = 1
      x.ears = 2
      x.angry = false
    
    proc newCat(): Cat =
      new result
      result.init
      return result
    
    method cry(x: Cat) =
      if x.angry:
        echo "Cat says: Grrr..."
      else:
        echo "Cat says: Mmm.."
    
    proc main =
      var s = newSeq[Animal]()
      let c = newCat()
      c.angry = true
      s.add(c)
      s.add(newDog())
      Dog(s[1]).birthsday()
      
      for a in s:
        a.cry()
        echo "Age: ", a.age
        if a of Dog:
          echo "A dog with ", Dog(a). tail, "tails"
    
    main()
    
    
    Run

I find this error very annoying as it is not easy to find the cause. And, event 
if "var" is not needed here, this is nevertheless a valid construct.

Reply via email to