<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Dec 2, 2016 at 6:35 AM, Malcolm Parsons via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 29 November 2016 at 17:52, Malcolm Parsons <<a href="mailto:malcolm.parsons@gmail.com">malcolm.parsons@gmail.com</a>> wrote:<br>
> On 29 November 2016 at 17:38, Zachary Turner <<a href="mailto:zturner@google.com">zturner@google.com</a>> wrote:<br>
>> I see, but I looked over your proposed implementation from earlier in the<br>
>> thread, and if I'm not mistaken I see this:<br>
><br>
> That's a different suggestion.<br>
<br>
</span>llvm_strlen could be something like this:<br>
<br>
#if __cpp_lib_constexpr_char_<wbr>traits<br>
constexpr size_t llvm_strlen(const char *S) {<br>
  return std::char_traits<char>::<wbr>length(S);<br>
}<br>
#elif __has_builtin(__builtin_<wbr>strlen) || defined(__GNUC__)<br>
constexpr size_t llvm_strlen(const char *S) { return __builtin_strlen(S); }<br>
#elif __cpp_constexpr >= 201304<br>
constexpr size_t llvm_strlen(const char *S) {<br>
  const char *const A = S;<br>
  while (*S != '\0') {<br>
    ++S;<br>
  }<br>
  return S - A;<br>
}<br>
#else<br>
constexpr size_t llvm_strlen(const char *S, size_t L = 0) {<br>
  return *S ? llvm_strlen(S + 1, L + 1) : L;<br>
}<br>
#endif<br>
<div class="HOEnZb"><div class="h5"></div></div></blockquote></div><br></div><div class="gmail_extra">...and we've gone in a loop in this conversation, haven't we? Isn't this again where you end up with really slow code for compilers that end up in the last #else, such as MSVC?</div><div class="gmail_extra"><br></div><div class="gmail_extra">+1 from me for the StringLiteral proposal from a few messages back.</div></div>