[cfe-dev] clang, static/inline, and windows.h

Eli Friedman eli.friedman at gmail.com
Wed May 18 09:24:57 PDT 2011


On Wed, May 18, 2011 at 8:54 AM, Douglas Gregor <dgregor at apple.com> wrote:
>
> On May 18, 2011, at 6:46 AM, Andrew wrote:
>
>> List,
>>
>> I am working on having clang parse a recent windows.h header. I am
>> encountering great success, however I have one problem with inlined
>> functions. In winnt.h, there are a series of definitions for
>> Int64ShllMod32 and related functions, these functions are defined as
>> __inline. Compiling a multi file project with clang produces errors
>> because these functions appear more than once and at link time
>> collisions occur.
>>
>> The problem seems to stem from the functions not being defined as
>> 'static'. If the functions are defined as static, they are inlined and
>> removed during compilation. Without the static definition, the
>> optimizer doesn't know it is safe to remove the functions after they
>> have been inlined.
>>
>> It seems that MSVC silently promotes any function declared __inline or
>> __forceinline to static (or something equivalent/similar). My thinking
>> is adding in a "compatibility" layer to clang so that when dealing
>> with windows header files clang also promotes any function defined as
>> inline to static storage. What does the list think? Is this a good
>> idea? If it is, where would a good place to start in clang be to
>> implement it? If it isn't a good idea, what would be?
>
>
> This is most likely due to Clang defaulting to C99 and its inline semantics, rather than the inline semantics used (e.g.) by GNU C or C++. As a simple experiment, try adding
>
>        -std=gnu89
>
> to your command line.
>
> See
>
>        http://clang.llvm.org/compatibility.html#inline
>
> for more information.

To clarify, MSVC in C mode actually uses C++-style semantics for
__inline, not the gnu89 or C99 semantics; see
http://llvm.org/bugs/show_bug.cgi?id=9392 .

-Eli




More information about the cfe-dev mailing list