This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: cygwin x86_64: mingw64-g++ 6.4.0 (both i686 and x86_64) issue (bug?) with reinterpret_cast
- From: Csaba Raduly <rcsaba at gmail dot com>
- To: cygwin list <cygwin at cygwin dot com>
- Date: Wed, 1 Nov 2017 15:25:28 +0100
- Subject: Re: cygwin x86_64: mingw64-g++ 6.4.0 (both i686 and x86_64) issue (bug?) with reinterpret_cast
- Authentication-results: sourceware.org; auth=none
- References: <515e5221f28f4df880916eaa1b25b7aa@SFHDAG5NODE3.st.com>
On Tue, Oct 31, 2017 at 11:00 AM, Paolo ZAMBOTTI wrote:
> Hi Csaba,
>
Please don't top-post (at least in this mailing list).
> Ok, then the issue are "my" lines of code and the error messages from g++ were not completely clear (and they was confusing me a little bit)...
> But I'm still not sure the issue is not in Cygwin package. I mean, my test code was a very simplified (too much simplified) excerpt from squid source code and, there, the link with header file from cygwin package is more clear.
> Then, let me post another test file where this link is more clear.
>
> Now the failure is as follow (g++ -std=gnu++11 -c -Wall -pedantic -Wextra test.cpp)
>
> In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/winbase.h:19:0,
> from /usr/i686-w64-mingw32/sys-root/mingw/include/windows.h:70,
> from test.cpp:1:
> test.cpp:6:45: error: reinterpret_cast from integer to pointer
> static constexpr HANDLE InvalidHandle = INVALID_HANDLE_VALUE;
> ^
>
> The issue is now within the macro definition of INVALID_HANDLE_VALUE in file handleapi.h (which could be, from i686-w64-mingw32, x86_64-w64-mingw32 or w32api)
>
> Now I'm wondering what is really wrong:
> does the definition of INVALID_HANDLE_VALUE need to be rewritten in order to be compatible with the "static constexpr" line
There's nothing wrong with INVALID_HANDLE_VALUE with regards to
"static constexpr", although a constexpr expression cannot contain
reinterpret_cast-s,
and a C-style cast can resort to be a reinterpret_cast. But this
doesn't seem to be the problem (there's a different error message for
that).
HANDLE is defined as a pointer:
include/wtypesbase.h:52:typedef void *HANDLE;
LONG_PTR is defined as an integer:
basetsd.h:54:typedef long LONG_PTR,*PLONG_PTR;
INVALID_HANDLE_VALUE is defined in handleapi.h:16 as
#define INVALID_HANDLE_VALUE ((HANDLE) (LONG_PTR)-1)
so you have a cast right there. Whenever you use INVALID_HANDLE_VALUE,
the compiler sees a cast from long to void*
I don't know how this could be fixed. You may want to ask on a
mingw-specific mailing list.
You could try adding -isystem /path/to/mingw/headers so mingw-gcc
finds its headers that way (warnings tend to be suppressed for headers
found in directories specified with -isystem rather than -i, although
mingw-gcc's built-in headers should be treated the same way).
(disclaimer: I havent tried this).
> or
> does "my" line of code has to be rewritten in order to be compatible with the INVALID_HANDLE_VALUE definition?
>
> In the latest case, any suggestion will be very welcome...
>
> Paolo.
Csaba
--
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple