diff options
-rw-r--r-- | absl/base/config.h | 7 | ||||
-rw-r--r-- | absl/copts.bzl | 26 | ||||
-rw-r--r-- | absl/memory/memory.h | 14 | ||||
-rw-r--r-- | absl/memory/memory_test.cc | 14 | ||||
-rw-r--r-- | absl/strings/escaping.h | 2 | ||||
-rw-r--r-- | absl/strings/substitute.h | 2 |
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) |