[cfe-dev] Latest clang and dllimport
Edward Diener
eldlistmailingz at tropicsoft.com
Tue Jul 21 22:22:08 PDT 2015
On 7/21/2015 6:43 PM, Reid Kleckner wrote:
> I don't think we have any feature test flags for diagnostic changes.
>
> It sounds like the general problem is that two headers declare parts of
> the win32 API because windows.h is too much of a header dependence.
> Boost also isn't sure sure whether windows.h, from mingw or Microsoft,
> is using dllimport or not. Past versions of mingw have been
> inconsistent, so you can't just always declare it dllimport, like it
> should be.
>
> I'm starting to feel like we should just downgrade this to a warning for
> free functions. We already make it a warning in other cases. Very few
> programs rely on function pointer identity, but global variable identity
> is often important.
Please do change this if it is possible for clang.
Let me argue the case as a clang user. Neither gcc or vc++ on Windows
requires the sort of attribute matching with imported Windows API
functions that clang requires. In other words if a Windows API has
__declspec(dllimport) as part of the declaration of a function and the
end-user separately declares that function without the
__declspec(dllimport), it is not an error with gcc or vc++.
By enforcing a matching of this __declspec(dllimport) you are making
code match whatever the particular Windows API header files specify. But
the various Windows implementations are different so now the end-user
has to figure out which Windows implementation is being used at
compile-time and manipulate his declaration accordingly. In particular
mingw never used any __declspec(dllimport) whereas mingw-64 appears to
always use it. The official Microsoft header files also use it. I have
not used cygwin but that is yet another case.
You may ask why any end-user is declaring a Windows API function instead
of just including windows.h. For Boost the answer is all the header file
dependencies that windows.h brings in, as well as the non C++-isms and
poor C++-isms which the windows header files are famous for and for
which code often has to find workarounds ( the common macro names are
one example of these sorts of problems ). So a Boost library will often
try not to include windows.h when it is using very few Windows API
functions.
By enforciong this strict function declaration matching clang is making
it much harder to declare Windows API functionality than it need be.
>
> Sound reasonable?
>
> On Tue, Jul 21, 2015 at 12:36 PM, Edward Diener
> <eldlistmailingz at tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>> wrote:
>
> In the latest clang built from source, if a function is mismatched
> as to a difference in dllimport attributes clang produces an error.
> As in:
>
> C:\Utilities\mingw-w64\i686-5.1.0-posix-dwarf-rt_v4-rev0\mingw32\i686-w64-mingw32\include\synchapi.h:127:26:
> error: redeclaration of 'Sleep' cannot add 'dllimport' attribute
> WINBASEAPI VOID WINAPI Sleep (DWORD dwMilliseconds);
> ^
> ..\..\..\boost/smart_ptr/detail/yield_k.hpp:67:29: note: previous
> declaration is here
> extern "C" void __stdcall Sleep( unsigned long ms );
>
> Changing the latter to:
>
> extern "C" __declspec(dllimport) void __stdcall Sleep( unsigned
> long ms );
>
> fixes the problem for clang.
>
> Earlier versions of clang ( 3.4.1, 3.5.2, 3.6.1 ) did not have this
> problem. Is there a __has_feature or __has_extension that I can use
> to test this change in the latest clang ? The previous versions are
> also happy with the __declspec(dllimport) added in the declaration
> so even without a __has_feature or __has_extension I can just test
> for clang on Windows, but I like to be as precise as possible in
> Boost code.
>
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> <mailto:cfe-dev at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
More information about the cfe-dev
mailing list