Web lists-archives.com

Re: cygwin x86_64: mingw64-g++ 6.4.0 (both i686 and x86_64) issue (bug?) with reinterpret_cast




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