[cfe-dev] Clang inconsistency with gcc on Windows

Yaron Keren yaron.keren at gmail.com
Sun May 31 21:21:37 PDT 2015


I'ts a good question wether __attribute__((dllimport)) should really be
ignored here but we'll probably want to in order to keep compatibility with
mingw. Could you file a bug report on this?


2015-06-01 3:20 GMT+03:00 Edward Diener <eldlistmailingz at tropicsoft.com>:

> On 5/31/2015 3:26 PM, Yaron Keren wrote:
>
>> Maybe gcc is more fogiving with checking redeclarations or some compiler
>> predefine is not the same. You can check this in depth by looking at
>> preprocess output (-E) and comparing how both compilers expand the
>> GetSystemTimeAsFileTime declaration.
>>
>
> Both compilers expand the different GetSystemTimeAsFileTime declaration in
> the internal Boost winapi headers and the mingw headers in exactly the same
> way.
>
> The preprocessed expansion in the internal Boost winapi header is:
>
>      __attribute__((dllimport)) void __attribute__((__stdcall__))
>          GetSystemTimeAsFileTime(FILETIME_* lpFileTime);
>
> and the preprocessed expansion in the mingw headers is:
>
>      void __attribute__((__stdcall__)) GetSystemTimeAsFileTime(LPFILETIME);
>
> where FILETIME_ and LPFILETIME are the same structure.
>
> The gcc compiler sees these declarations as the same but the clang
> compiler sees them as different and therefore an error.
>
>
>>
>> 2015-05-31 21:50 GMT+03:00 Edward Diener
>> <eldlistmailingz at tropicsoft.com
>> <mailto:eldlistmailingz at tropicsoft.com>>:
>>
>>     On 5/31/2015 2:05 PM, Yaron Keren wrote:
>>
>>         Boost tries to supplies its own version of the Windows API to
>> avoid
>>         including WIndows.h
>>         Boost version of the API is not strictly identical to Windows.h,
>>         so if
>>         Windows.h do get included somehow such errors happen. I always
>>         -DBOOST_USE_WINDOWS_H to force Boost to use Windows.h instead of
>>         its own.
>>
>>
>>     Thanks, that does work.
>>
>>     I still would like to know why clang is giving errors in the
>>     situation I describe in my OP and gcc is not. I am not saying that
>>     clang is wrong to do so but clearly it is not being compatible with
>>     gcc in this area.
>>
>>
>>
>>
>>         2015-05-31 20:48 GMT+03:00 Edward Diener
>>         <eldlistmailingz at tropicsoft.com
>>         <mailto:eldlistmailingz at tropicsoft.com>
>>         <mailto:eldlistmailingz at tropicsoft.com
>>
>>         <mailto:eldlistmailingz at tropicsoft.com>>>:
>>
>>
>>              Compiling some Boost library code the latest clang has
>>         produced an
>>              inconsistency with gcc on Windows that is making it
>>         impossible to
>>              build Boost libraries successfully.
>>
>>              The code in question, where clang is given an error:
>>
>>                  clang-linux.compile.c++.without-pth
>>
>>
>> ..\..\..\bin.v2\libs\context\build\clang-linux-3.7.0\debug\threading-multi\windows\stack_traits.obj
>>                  In file included from
>>                  ..\..\..\libs\context\src\windows\stack_traits.cpp:24:
>>                  In file included from ..\..\..\boost/thread.hpp:13:
>>                  In file included from
>> ..\..\..\boost/thread/thread.hpp:12:
>>                  In file included from
>>         ..\..\..\boost/thread/thread_only.hpp:15:
>>                  In file included from
>>                  ..\..\..\boost/thread/win32/thread_data.hpp:10:
>>                  In file included from
>>         ..\..\..\boost/thread/thread_time.hpp:10:
>>                  In file included from
>>                  ..\..\..\boost/date_time/microsec_time_clock.hpp:23:
>>                  ..\..\..\boost/date_time/filetime_functions.hpp:57:46:
>>         error:
>>                  conflicting types for 'GetSystemTimeAsFileTime'
>>                           __declspec(dllimport) void __stdcall
>>                  GetSystemTimeAsFileTime(FILETIME* lpFileTime);
>>                                                                ^
>>                  /mingw/include\winbase.h:1397:24: note: previous
>>         declaration is here
>>                  WINBASEAPI void WINAPI
>> GetSystemTimeAsFileTime(LPFILETIME);
>>
>>                                        ^
>>
>>              and more of the same in many places building Boost
>>         libraries with clang.
>>
>>              This is with the latest clang, which I build with
>>         mingw/gcc-4.8.1 on
>>              Windows.
>>
>>              With gcc-4.8.1:
>>
>>                  gcc.compile.c++
>>
>>
>> ..\..\..\bin.v2\libs\context\build\gcc-mingw-4.8.1\debug\threading-multi\windows\stack_traits.o
>>
>>
>>              With gcc-4.9.2
>>
>>                  gcc.compile.c++
>>
>>
>> ..\..\..\bin.v2\libs\context\build\gcc-mingw-4.9.2\debug\threading-multi\windows\stack_traits.o
>>
>>
>>              This is happening extensively in Boost code which uses the
>>         Windows
>>              API when compiling under Windows.
>>
>>              I do not know what WINBASEAPI is supposed to resove to
>>         under mingw,
>>              but clearly it should not be different for gcc and clang
>> under
>>              Windows and gcc has no problems with this.
>>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150601/92498f76/attachment.html>


More information about the cfe-dev mailing list