BUG #13788: compile error in generic_msvc.h

Started by Paul Mooreover 10 years ago7 messagesbugs
Jump to latest
#1Paul Moore
paul.moore@centrify.com

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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Paul Moore (#1)
Re: 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:

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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#3Paul Moore
paul.moore@centrify.com
In reply to: Tom Lane (#2)
Re: BUG #13788: compile error in generic_msvc.h

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

-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
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:

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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#4Andres Freund
andres@anarazel.de
In reply to: Paul Moore (#3)
Re: 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 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).

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#5Paul Moore
paul.moore@centrify.com
In reply to: Andres Freund (#4)
Re: BUG #13788: compile error in generic_msvc.h

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]
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 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).

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#6Andres Freund
andres@anarazel.de
In reply to: Paul Moore (#5)
Re: 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

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]
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 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).

--
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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#7Paul Moore
paul.moore@centrify.com
In reply to: Andres Freund (#6)
Re: BUG #13788: compile error in generic_msvc.h

I put the cast in and it compiles with no complaint

-----Original Message-----
From: Andres Freund [mailto:andres@anarazel.de]
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

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]
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 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).

--
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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs