|  | @@ -172,19 +172,9 @@ class string_view {
 | 
	
		
			
				|  |  |    // Implicit constructor of a `string_view` from nul-terminated `str`. When
 | 
	
		
			
				|  |  |    // accepting possibly null strings, use `absl::NullSafeStringView(str)`
 | 
	
		
			
				|  |  |    // instead (see below).
 | 
	
		
			
				|  |  | -#if ABSL_HAVE_BUILTIN(__builtin_strlen) || \
 | 
	
		
			
				|  |  | -    (defined(__GNUC__) && !defined(__clang__))
 | 
	
		
			
				|  |  | -  // GCC has __builtin_strlen according to
 | 
	
		
			
				|  |  | -  // https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Other-Builtins.html, but
 | 
	
		
			
				|  |  | -  // ABSL_HAVE_BUILTIN doesn't detect that, so we use the extra checks above.
 | 
	
		
			
				|  |  | -  // __builtin_strlen is constexpr.
 | 
	
		
			
				|  |  |    constexpr string_view(const char* str)  // NOLINT(runtime/explicit)
 | 
	
		
			
				|  |  |        : ptr_(str),
 | 
	
		
			
				|  |  | -        length_(CheckLengthInternal(str ? __builtin_strlen(str) : 0)) {}
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -  constexpr string_view(const char* str)  // NOLINT(runtime/explicit)
 | 
	
		
			
				|  |  | -      : ptr_(str), length_(CheckLengthInternal(str ? strlen(str) : 0)) {}
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | +        length_(str ? CheckLengthInternal(StrlenInternal(str)) : 0) {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Implicit constructor of a `string_view` from a `const char*` and length.
 | 
	
		
			
				|  |  |    constexpr string_view(const char* data, size_type len)
 | 
	
	
		
			
				|  | @@ -495,6 +485,24 @@ class string_view {
 | 
	
		
			
				|  |  |      return ABSL_ASSERT(len <= kMaxSize), len;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  static constexpr size_type StrlenInternal(const char* str) {
 | 
	
		
			
				|  |  | +#if defined(_MSC_VER) && _MSC_VER >= 1910 && !defined(__clang__)
 | 
	
		
			
				|  |  | +    // MSVC 2017+ can evaluate this at compile-time.
 | 
	
		
			
				|  |  | +    const char* begin = str;
 | 
	
		
			
				|  |  | +    while (*str != '\0') ++str;
 | 
	
		
			
				|  |  | +    return str - begin;
 | 
	
		
			
				|  |  | +#elif ABSL_HAVE_BUILTIN(__builtin_strlen) || \
 | 
	
		
			
				|  |  | +    (defined(__GNUC__) && !defined(__clang__))
 | 
	
		
			
				|  |  | +    // GCC has __builtin_strlen according to
 | 
	
		
			
				|  |  | +    // https://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Other-Builtins.html, but
 | 
	
		
			
				|  |  | +    // ABSL_HAVE_BUILTIN doesn't detect that, so we use the extra checks above.
 | 
	
		
			
				|  |  | +    // __builtin_strlen is constexpr.
 | 
	
		
			
				|  |  | +    return __builtin_strlen(str);
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +    return str ? strlen(str) : 0;
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    const char* ptr_;
 | 
	
		
			
				|  |  |    size_type length_;
 | 
	
		
			
				|  |  |  };
 |