<div dir="ltr">On Mon, Dec 21, 2015 at 12:08 AM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br><div class="gmail_quote"><div dir="ltr"><span class=""></span><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><span class="">On Sun, Dec 20, 2015 at 5:57 PM, Johan Engelen <<a href="mailto:jbc.engelen@gmail.com" target="_blank">jbc.engelen@gmail.com</a>> wrote:<br>
><br></span><span class="">
> Perhaps LLVM_ATTRIBUTE_ALWAYS_INLINE could be defined to "inline" if the<br>
> compiler has no support for always_inline (currently it is set to nothing in<br>
> that case) ?<br>
> I think this would allow removal of the "inline" after<br>
> LLVM_ATTRIBUTE_ALWAYS_INLINE.<br>
<br>
</span></div></div><span class="">Wouldn't this cause functions with MSVC that are marked<br>
LLVM_ATTRIBUTE_ALWAYS_INLINE but not 'inline' to not be inlined?<br></span></blockquote><div><br></div><div>__forceinline means that MSVC will always inline that function, that is why the extra "inline" results in a warning.<br><br></div><div>I propose:<br></div><div>in <span>llvm/Support/Compiler.h</span><br><pre><span>  #if __has_attribute(always_inline) || LLVM_GNUC_PREREQ(4, 0, 0)</span>
<span></span><span>  #define LLVM_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))</span>
<a name="151c1b78c97dc1dc_l00193"></a><span>  #elif defined(_MSC_VER)</span>
<a name="151c1b78c97dc1dc_l00194"></a><span>  #define LLVM_ATTRIBUTE_ALWAYS_INLINE __forceinline</span>
<a name="151c1b78c97dc1dc_l00195"></a><span>  #else</span>
<a name="151c1b78c97dc1dc_l00196"></a><span></span><span>- #define LLVM_ATTRIBUTE_ALWAYS_INLINE</span>
<a name="151c1b78c97dc1dc_l00197"></a><span></span><span><a name="151c1b78c97dc1dc_l00196"></a><span></span><span>+ #define LLVM_ATTRIBUTE_ALWAYS_INLINE inline</span>
<a name="151c1b78c97dc1dc_l00197"></a><span></span><span></span>  #endif</span></pre>and elsewhere<br><pre>  LLVM_ATTRIBUTE_ALWAYS_INLINE
<span>- inline</span> <span>bool</span> operator==(StringRef LHS, StringRef RHS) {<br><span>+ </span><span>bool</span> operator==(StringRef LHS, StringRef RHS) {<br>    <span>return</span> LHS.equals(RHS);
  }</pre>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 ;) <br></div><div><br></div><div> -Johan<br></div></div><br></div></div>
</div><br></div>