Обсуждение: BUG #13788: compile error in generic_msvc.h
The following bug has been logged on the website: Bug reference: 13788 Logged by: paul moore Email address: paul.moore@centrify.com PostgreSQL version: 9.5beta1 Operating system: win server 2012 Description: 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): error C2664: 'LONG64 _InterlockedCompareExchange64(volatile LONG64 *,LONG64,LONG64)': cannot convert argument 1 from 'volatile uint64 *' to 'volatile LONG64 *' same for the add64 function a few lines later
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: > 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): error > C2664: 'LONG64 _InterlockedCompareExchange64(volatile LONG64 > *,LONG64,LONG64)': cannot convert argument 1 from 'volatile uint64 *' 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 compiler is unhappy about passing an unsigned argument to a signed parameter; but if they've tightened it up like that, why no similar complaint for the 32-bit versions just above these? Can you try inserting a cast to (volatile int64 *), just to see? regards, tom lane
On 2015-12-02 16:13:07 +0000, Paul Moore wrote: > 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*) Destination, (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 sameerror Given that win64 buildfarm members have happily been compiling this code I suspect that's the cause. Are you including the headers with extern "C" or not? You're using SPI directly from C++? You got to be *very* careful doing that - postgres uses longjmp which isn't necessarily compatible with C++ (doesn't call destructors to be called and such).
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
Yes on extern "C". I have other stuff working Really what I am trying to do is invoke c# code. I am going to need to call= SPI. I tried to find out if anybody else had done it and found nothing. The c++ code is simply a thin shim from native c to c# -----Original Message----- From: Andres Freund [mailto:andres@anarazel.de]=20 Sent: Wednesday, December 2, 2015 8:50 AM To: Paul Moore <paul.moore@centrify.com> Cc: Tom Lane <tgl@sss.pgh.pa.us>; pgsql-bugs@postgresql.org Subject: Re: [BUGS] BUG #13788: compile error in generic_msvc.h On 2015-12-02 16:13:07 +0000, Paul Moore wrote: > The 32 bit functions are defined on unsigned types >=20 > From winbase.h >=20 > FORCEINLINE > unsigned > InterlockedCompareExchange( > _Inout_ _Interlocked_operand_ unsigned volatile *Destination, > _In_ unsigned Exchange, > _In_ unsigned Comperand > ) > { > return (unsigned) _InterlockedCompareExchange((volatile long*)=20 > Destination, (long) Exchange, (long) Comperand); } >=20 > The cast fixes the 64 bit case. >=20 > Full disclosure, I am compiling as c++. I think that might be the=20 > cause. I tried in a c project and did not get the same error Given that win64 buildfarm members have happily been compiling this code I = suspect that's the cause. Are you including the headers with extern "C" or = not? You're using SPI directly from C++? You got to be *very* careful doing that= - postgres uses longjmp which isn't necessarily compatible with C++ (doesn= 't call destructors to be called and such).
Hi Paul, As I don't have access to msvc: Could you try what Tom suggested in http://archives.postgresql.org/message-id/5176.1449005701%40sss.pgh.pa.us ? Regards, Andres On 2015-12-03 17:02:31 +0000, Paul Moore wrote: > Yes on extern "C". I have other stuff working > > Really what I am trying to do is invoke c# code. I am going to need to call SPI. I tried to find out if anybody else haddone it and found nothing. > > The c++ code is simply a thin shim from native c to c# > > -----Original Message----- > From: Andres Freund [mailto:andres@anarazel.de] > Sent: Wednesday, December 2, 2015 8:50 AM > To: Paul Moore <paul.moore@centrify.com> > Cc: Tom Lane <tgl@sss.pgh.pa.us>; pgsql-bugs@postgresql.org > Subject: Re: [BUGS] BUG #13788: compile error in generic_msvc.h > > On 2015-12-02 16:13:07 +0000, Paul Moore wrote: > > 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*) > > Destination, (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 > > Given that win64 buildfarm members have happily been compiling this code I suspect that's the cause. Are you includingthe headers with extern "C" or not? > > You're using SPI directly from C++? You got to be *very* careful doing that - postgres uses longjmp which isn't necessarilycompatible with C++ (doesn't call destructors to be called and such). > > > -- > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-bugs Greetings, Andres Freund
I put the cast in and it compiles with no complaint -----Original Message----- From: Andres Freund [mailto:andres@anarazel.de]=20 Sent: Thursday, December 10, 2015 7:14 AM To: Paul Moore <paul.moore@centrify.com> Cc: Tom Lane <tgl@sss.pgh.pa.us>; pgsql-bugs@postgresql.org Subject: Re: [BUGS] BUG #13788: compile error in generic_msvc.h Hi Paul, As I don't have access to msvc: Could you try what Tom suggested in http://= archives.postgresql.org/message-id/5176.1449005701%40sss.pgh.pa.us ? Regards, Andres On 2015-12-03 17:02:31 +0000, Paul Moore wrote: > Yes on extern "C". I have other stuff working >=20 > Really what I am trying to do is invoke c# code. I am going to need to ca= ll SPI. I tried to find out if anybody else had done it and found nothing. >=20 > The c++ code is simply a thin shim from native c to c# >=20 > -----Original Message----- > From: Andres Freund [mailto:andres@anarazel.de] > Sent: Wednesday, December 2, 2015 8:50 AM > To: Paul Moore <paul.moore@centrify.com> > Cc: Tom Lane <tgl@sss.pgh.pa.us>; pgsql-bugs@postgresql.org > Subject: Re: [BUGS] BUG #13788: compile error in generic_msvc.h >=20 > On 2015-12-02 16:13:07 +0000, Paul Moore wrote: > > The 32 bit functions are defined on unsigned types > >=20 > > From winbase.h > >=20 > > FORCEINLINE > > unsigned > > InterlockedCompareExchange( > > _Inout_ _Interlocked_operand_ unsigned volatile *Destination, > > _In_ unsigned Exchange, > > _In_ unsigned Comperand > > ) > > { > > return (unsigned) _InterlockedCompareExchange((volatile long*)=20 > > Destination, (long) Exchange, (long) Comperand); } > >=20 > > The cast fixes the 64 bit case. > >=20 > > Full disclosure, I am compiling as c++. I think that might be the=20 > > cause. I tried in a c project and did not get the same error >=20 > Given that win64 buildfarm members have happily been compiling this code = I suspect that's the cause. Are you including the headers with extern "C" o= r not? >=20 > You're using SPI directly from C++? You got to be *very* careful doing th= at - postgres uses longjmp which isn't necessarily compatible with C++ (doe= sn't call destructors to be called and such). >=20 >=20 > -- > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make=20 > changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-bugs Greetings, Andres Freund