[llvm-dev] MSVC warning noise on "LLVM_ATTRIBUTE_ALWAYS_INLINE inline void foo()"
Aaron Ballman via llvm-dev
llvm-dev at lists.llvm.org
Mon Dec 21 06:57:33 PST 2015
On Mon, Dec 21, 2015 at 6:40 AM, Johan Engelen <jbc.engelen at gmail.com> wrote:
> On Mon, Dec 21, 2015 at 12:08 AM, Aaron Ballman <aaron at aaronballman.com>
> wrote:
>>
>> On Sun, Dec 20, 2015 at 5:57 PM, Johan Engelen <jbc.engelen at gmail.com>
>> wrote:
>> >
>> > Perhaps LLVM_ATTRIBUTE_ALWAYS_INLINE could be defined to "inline" if the
>> > compiler has no support for always_inline (currently it is set to
>> > nothing in
>> > that case) ?
>> > I think this would allow removal of the "inline" after
>> > LLVM_ATTRIBUTE_ALWAYS_INLINE.
>>
>> Wouldn't this cause functions with MSVC that are marked
>> LLVM_ATTRIBUTE_ALWAYS_INLINE but not 'inline' to not be inlined?
>
>
> __forceinline means that MSVC will always inline that function, that is why
> the extra "inline" results in a warning.
__forceinline is still just a hint to the compiler to do the inline,
but it is a stronger hint that inline
(https://msdn.microsoft.com/en-us/library/bw1hbe6y.aspx). inline is a
keyword in C++ that has additional semantics that __forceinline is not
required to have, such as the fact that an inline function with
external linkage is required to have the same address in all TUs. I am
not comfortable assuming that inline === __forceinline for all
versions of MSVC (including future ones).
~Aaron
>
> I propose:
> in llvm/Support/Compiler.h
>
> #if __has_attribute(always_inline) || LLVM_GNUC_PREREQ(4, 0, 0)
> #define LLVM_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
> #elif defined(_MSC_VER)
> #define LLVM_ATTRIBUTE_ALWAYS_INLINE __forceinline
> #else
> - #define LLVM_ATTRIBUTE_ALWAYS_INLINE
> + #define LLVM_ATTRIBUTE_ALWAYS_INLINE inline
> #endif
>
> and elsewhere
>
> LLVM_ATTRIBUTE_ALWAYS_INLINE
> - inline bool operator==(StringRef LHS, StringRef RHS) {
> + bool operator==(StringRef LHS, StringRef RHS) {
> return LHS.equals(RHS);
> }
>
> As far as I can tell from online documentation, that will do the correct
> thing on MSVC and GCC. For non-MSVC, non-GCC, this will add "inline" in
> front of some functions that do not have it right now, notably member
> functions that are defined in the class definition (see e.g. StringRef.h
> empty()). I will have to test if /that/ doesn't create a warning ;)
>
> -Johan
>
>
More information about the llvm-dev
mailing list