I’m getting a "type mismatch" when compiling my code, and I cannot see what I’m 
doing wrong. Since the code is somewhat large, here is a summarized version:
    
    
    # MODULE atomiks
    
    type
      VolatilePtr*[T] = distinct ptr T
    
    template declVolatile*(name: untyped, T: typedesc, init: T) {.dirty.} =
      ## Defines an hidden volatile value, with an initial value,  and a 
pointer to it
      var `volatile XXX name XXX value` {.global,volatile.} = init
      let `name` {.global.} = cast[VolatilePtr[T]](addr `volatile XXX name XXX 
value`)
    
    # ...
    
    proc atomicIncRelaxed*[T: AtomType](p: VolatilePtr[T], x: T = 1): T =
      ## Increments a volatile (32/64 bit) value, and returns the new value.
      ## Performed in RELAXED/No-Fence memory-model.
      ## Will only compile on Windows 8+!
      let pp = cast[pointer](p)
      when sizeof(T) == 8:
        cast[T](interlockedExchangeAddNoFence64(pp, cast[int64](x)))
      elif sizeof(T) == 4:
        cast[T](interlockedExchangeAddNoFence32(pp, cast[int32](x)))
      else:
        static: assert(false, "invalid parameter size: " & $sizeof(T))
    
    # MODULE kueues
    
    type
      MsgSeqID* = int32
    
    declVolatile(myProcessGlobalSeqID, MsgSeqID, MsgSeqID(0))
    # Current (global) per Process message sequence ID.
    
    proc seqidProvider(): MsgSeqID =
      ## Generates a message sequence ID for the Thread.
      result = atomicIncRelaxed(myProcessGlobalSeqID) # LINE NO 213
    

The line with atomicIncRelaxed() doesn’t compile with this message:
    
    
    kueues.nim(213, 14) Error: type mismatch: got (int) but expected 'MsgSeqID 
= int32'
    

I think that the type of “myProcessGlobalSeqID” should be 
“VolatilePtr[MsgSeqID]”, therefore the call to 
“atomicIncRelaxed(myProcessGlobalSeqID)” should receive a 
“VolatilePtr[MsgSeqID]” as input parameter, and return a “MsgSeqID” as output, 
since I cast the result of "interlockedExchangeAddNoFenceXX()" to "T". Since 
“result” is of type “MsgSeqID”, everything should be fine, IMO.

Reply via email to