From: Christopher Dykes Date: Mon, 1 Feb 2016 20:36:43 +0000 (-0800) Subject: Support constexpr_strlen under MSVC. X-Git-Tag: deprecate-dynamic-initializer~113 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=db12591c87037bc679bbbe73820ecaff0b926e2d Support constexpr_strlen under MSVC. Summary: MSVC doesn't support evaluating strlen at compile time, so implement our own version instead. Reviewed By: yfeldblum, lbrandy Differential Revision: D2856926 fb-gh-sync-id: 22222350b57d9eff6a06c9d0f37d43a3cb1f2534 --- diff --git a/folly/Portability.h b/folly/Portability.h index 41c59820..5054afd8 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -439,9 +439,19 @@ inline void asm_pause() { #endif } +#ifdef _MSC_VER +constexpr size_t constexpr_strlen_internal(const char* s, size_t len) { + return *s == '\0' ? len : constexpr_strlen_internal(s + 1, len + 1); +} +static_assert(constexpr_strlen_internal("123456789", 0) == 9, + "Someone appears to have broken constexpr_strlen..."); +#endif + constexpr size_t constexpr_strlen(const char* s) { #if defined(__clang__) return __builtin_strlen(s); +#elif defined(_MSC_VER) + return s == nullptr ? 0 : constexpr_strlen_internal(s, 0); #else return strlen(s); #endif diff --git a/folly/json.cpp b/folly/json.cpp index 438cdf2e..2fb8d78a 100644 --- a/folly/json.cpp +++ b/folly/json.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -487,7 +488,7 @@ dynamic parseNumber(Input& in) { constexpr const char* maxInt = "9223372036854775807"; constexpr const char* minInt = "9223372036854775808"; - constexpr auto maxIntLen = __builtin_strlen(maxInt); + constexpr auto maxIntLen = constexpr_strlen(maxInt); if (*in != '.' && !wasE && in.getOpts().parse_numbers_as_strings) {