The 32 bit functions are defined on unsigned types
From winbase.h
FORCEINLINE
unsigned
InterlockedCompareExchange(
_Inout_ _Interlocked_operand_ unsigned volatile *Destination,
_In_ unsigned Exchange,
_In_ unsigned Comperand
)
{
return (unsigned) _InterlockedCompareExchange((volatile long*) Destinat=
ion, (long) Exchange, (long) Comperand);
}
The cast fixes the 64 bit case.
Full disclosure, I am compiling as c++. I think that might be the cause. I =
tried in a c project and did not get the same error
-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]=20
Sent: Tuesday, December 1, 2015 1:35 PM
To: Paul Moore <paul.moore@centrify.com>
Cc: pgsql-bugs@postgresql.org; Andres Freund <andres@anarazel.de>
Subject: Re: [BUGS] BUG #13788: compile error in generic_msvc.h
paul.moore@centrify.com writes:
> Bug reference: 13788
> Logged by: paul moore
> Email address: paul.moore@centrify.com
> PostgreSQL version: 9.5beta1
> Operating system: win server 2012
> Description: =20
> vs 2015, compiling spi execq sample
> vc complains about this
> 1>c:\Program
> Files\PostgreSQL\9.5\include\server\port/atomics/generic-msvc.h(91):=20
> error
> C2664: 'LONG64 _InterlockedCompareExchange64(volatile LONG64
> *,LONG64,LONG64)': cannot convert argument 1 from 'volatile uint64 *'=20
> to 'volatile LONG64 *'
> same for the add64 function a few lines later
That's a bit weird. A perhaps plausible explanation would be that the comp=
iler is unhappy about passing an unsigned argument to a signed parameter; b=
ut if they've tightened it up like that, why no similar complaint for the 3=
2-bit versions just above these?
Can you try inserting a cast to (volatile int64 *), just to see?
regards, tom lane