about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--absl/base/config.h7
-rw-r--r--absl/copts.bzl26
-rw-r--r--absl/memory/memory.h14
-rw-r--r--absl/memory/memory_test.cc14
-rw-r--r--absl/strings/escaping.h2
-rw-r--r--absl/strings/substitute.h2
6 files changed, 50 insertions, 15 deletions
diff --git a/absl/base/config.h b/absl/base/config.h
index 3f3b8b3a64e3..6703d0eac715 100644
--- a/absl/base/config.h
+++ b/absl/base/config.h
@@ -138,9 +138,10 @@
 // supported.
 #ifdef ABSL_HAVE_THREAD_LOCAL
 #error ABSL_HAVE_THREAD_LOCAL cannot be directly set
-#elif !defined(__apple_build_version__) ||   \
-    ((__apple_build_version__ >= 8000042) && \
-     !(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0))
+#elif (!defined(__apple_build_version__) || \
+       (__apple_build_version__ >= 8000042)) && \
+      !(defined(__APPLE__) && TARGET_OS_IPHONE && \
+        __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0)
 // Notes: Xcode's clang did not support `thread_local` until version
 // 8, and even then not for all iOS < 9.0.
 #define ABSL_HAVE_THREAD_LOCAL 1
diff --git a/absl/copts.bzl b/absl/copts.bzl
index fa111a00f15b..20c9b6190dc9 100644
--- a/absl/copts.bzl
+++ b/absl/copts.bzl
@@ -10,7 +10,6 @@ GCC_FLAGS = [
     "-Wcast-qual",
     "-Wconversion-null",
     "-Wmissing-declarations",
-    "-Wno-sign-compare",
     "-Woverlength-strings",
     "-Wpointer-arith",
     "-Wunused-local-typedefs",
@@ -18,6 +17,9 @@ GCC_FLAGS = [
     "-Wvarargs",
     "-Wvla",  # variable-length array
     "-Wwrite-strings",
+    # Google style does not use unsigned integers, though STL containers
+    # have unsigned types.
+    "-Wno-sign-compare",
 ]
 
 GCC_TEST_FLAGS = [
@@ -34,36 +36,43 @@ GCC_TEST_FLAGS = [
 # Docs on groups of flags is preceded by ###.
 
 LLVM_FLAGS = [
+    # All warnings are treated as errors by implicit -Werror flag
     "-Wall",
     "-Wextra",
     "-Weverything",
     # Abseil does not support C++98
     "-Wno-c++98-compat-pedantic",
-    "-Wno-comma",
     # Turns off all implicit conversion warnings. Most are re-enabled below.
     "-Wno-conversion",
     "-Wno-covered-switch-default",
     "-Wno-deprecated",
     "-Wno-disabled-macro-expansion",
     "-Wno-double-promotion",
-    "-Wno-exit-time-destructors",
+    ###
+    # Turned off as they include valid C++ code.
+    "-Wno-comma",
     "-Wno-extra-semi",
+    "-Wno-packed",
+    "-Wno-padded",
+    ###
     "-Wno-float-conversion",
     "-Wno-float-equal",
     "-Wno-format-nonliteral",
-    # Too aggressive: warns on Clang extensions enclosed in Clang-only code paths.
+    # Too aggressive: warns on Clang extensions enclosed in Clang-only
+    # compilation paths.
     "-Wno-gcc-compat",
+    ###
+    # Some internal globals are necessary. Don't do this at home.
     "-Wno-global-constructors",
+    "-Wno-exit-time-destructors",
+    ###
     "-Wno-nested-anon-types",
     "-Wno-non-modular-include-in-module",
     "-Wno-old-style-cast",
-    "-Wno-packed",
-    "-Wno-padded",
     # Warns on preferred usage of non-POD types such as string_view
     "-Wno-range-loop-analysis",
     "-Wno-reserved-id-macro",
     "-Wno-shorten-64-to-32",
-    "-Wno-sign-conversion",
     "-Wno-switch-enum",
     "-Wno-thread-safety-negative",
     "-Wno-undef",
@@ -84,6 +93,7 @@ LLVM_FLAGS = [
     "-Wnon-literal-null-conversion",
     "-Wnull-conversion",
     "-Wobjc-literal-conversion",
+    "-Wno-sign-conversion",
     "-Wstring-conversion",
     ###
 ]
@@ -108,7 +118,7 @@ LLVM_TEST_FLAGS = [
 MSVC_FLAGS = [
     "/W3",
     "/WX",
-    "/wd4005",  # macro-redifinition
+    "/wd4005",  # macro-redefinition
     "/wd4068",  # unknown pragma
     "/wd4244",  # conversion from 'type1' to 'type2', possible loss of data
     "/wd4267",  # conversion from 'size_t' to 'type', possible loss of data
diff --git a/absl/memory/memory.h b/absl/memory/memory.h
index 22d44b9e46fe..2220ee4e412f 100644
--- a/absl/memory/memory.h
+++ b/absl/memory/memory.h
@@ -319,13 +319,23 @@ struct RebindPtr<T, U, void_t<typename T::template rebind<U>>> {
   using type = typename T::template rebind<U>;
 };
 
-template <typename T, typename U, typename = void>
+template <typename T, typename U>
+constexpr bool HasRebindAlloc(...) {
+  return false;
+}
+
+template <typename T, typename U>
+constexpr bool HasRebindAlloc(typename T::template rebind<U>::other*) {
+  return true;
+}
+
+template <typename T, typename U, bool = HasRebindAlloc<T, U>(nullptr)>
 struct RebindAlloc {
   using type = typename RebindFirstArg<T, U>::type;
 };
 
 template <typename T, typename U>
-struct RebindAlloc<T, U, void_t<typename T::template rebind<U>::other>> {
+struct RebindAlloc<T, U, true> {
   using type = typename T::template rebind<U>::other;
 };
 
diff --git a/absl/memory/memory_test.cc b/absl/memory/memory_test.cc
index 7d047ca0c726..dee9b486a30d 100644
--- a/absl/memory/memory_test.cc
+++ b/absl/memory/memory_test.cc
@@ -439,6 +439,20 @@ TEST(AllocatorTraits, Typedefs) {
 }
 
 template <typename T>
+struct AllocWithPrivateInheritance : private std::allocator<T> {
+  using value_type = T;
+};
+
+TEST(AllocatorTraits, RebindWithPrivateInheritance) {
+  // Regression test for some versions of gcc that do not like the sfinae we
+  // used in combination with private inheritance.
+  EXPECT_TRUE(
+      (std::is_same<AllocWithPrivateInheritance<int>,
+                    absl::allocator_traits<AllocWithPrivateInheritance<char>>::
+                        rebind_alloc<int>>::value));
+}
+
+template <typename T>
 struct Rebound {};
 
 struct AllocWithRebind {
diff --git a/absl/strings/escaping.h b/absl/strings/escaping.h
index 86f63aad7dc0..1af0afa789cc 100644
--- a/absl/strings/escaping.h
+++ b/absl/strings/escaping.h
@@ -152,7 +152,7 @@ std::string HexStringToBytes(absl::string_view from);
 
 // BytesToHexString()
 //
-// Converts binary data into an ASCII text std::string, returing a std::string of size
+// Converts binary data into an ASCII text std::string, returning a std::string of size
 // `2*from.size()`.
 std::string BytesToHexString(absl::string_view from);
 
diff --git a/absl/strings/substitute.h b/absl/strings/substitute.h
index 3fc4ac4cdcc4..76d6d8e966d6 100644
--- a/absl/strings/substitute.h
+++ b/absl/strings/substitute.h
@@ -109,7 +109,7 @@ class Arg {
   //
   // Explicitly overload `const char*` so the compiler doesn't cast to `bool`.
   Arg(const char* value)  // NOLINT(runtime/explicit)
-      : piece_(value) {}
+      : piece_(absl::NullSafeStringView(value)) {}
   Arg(const std::string& value)  // NOLINT(runtime/explicit)
       : piece_(value) {}
   Arg(absl::string_view value)  // NOLINT(runtime/explicit)