diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel index 5f8863599..23439a090 100644 --- a/absl/base/BUILD.bazel +++ b/absl/base/BUILD.bazel @@ -286,6 +286,7 @@ cc_test( copts = ABSL_TEST_COPTS, deps = [ ":config", + "//absl/synchronization:thread_pool", "@com_google_googletest//:gtest_main", ], ) diff --git a/absl/base/casts.h b/absl/base/casts.h index 2a0adc295..266c4a0a9 100644 --- a/absl/base/casts.h +++ b/absl/base/casts.h @@ -50,7 +50,7 @@ namespace absl { // // An `implicit_cast()` may also be used to annotate numeric type conversions // that, although safe, may produce compiler warnings (such as `long` to `int`). -// Additionally, an `implict_cast()` is also useful within return statements to +// Additionally, an `implicit_cast()` is also useful within return statements to // indicate a specific implicit conversion is being undertaken. // // Example: diff --git a/absl/base/config.h b/absl/base/config.h index cf47f84c3..c768e7223 100644 --- a/absl/base/config.h +++ b/absl/base/config.h @@ -56,6 +56,13 @@ #include #endif // __cplusplus +#if defined(__APPLE__) +// Included for TARGET_OS_IPHONE, __IPHONE_OS_VERSION_MIN_REQUIRED, +// __IPHONE_8_0. +#include +#include +#endif + #include "absl/base/policy_checks.h" // ----------------------------------------------------------------------------- @@ -151,12 +158,13 @@ // // Checks whether C++11's `thread_local` storage duration specifier is // supported. -// -// Notes: Clang implements the `thread_local` keyword but Xcode did not support -// the implementation until Xcode 8. #ifdef ABSL_HAVE_THREAD_LOCAL #error ABSL_HAVE_THREAD_LOCAL cannot be directly set -#elif !defined(__apple_build_version__) || __apple_build_version__ >= 8000042 +#elif !defined(__apple_build_version__) || \ + ((__apple_build_version__ >= 8000042) && \ + !(TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0)) +// Notes: Xcode's clang did not support `thread_local` until version +// 8, and even then not for iOS < 8.0. #define ABSL_HAVE_THREAD_LOCAL 1 #endif diff --git a/absl/base/config_test.cc b/absl/base/config_test.cc index ab04b4474..c839712a5 100644 --- a/absl/base/config_test.cc +++ b/absl/base/config_test.cc @@ -17,12 +17,12 @@ #include #include "gtest/gtest.h" +#include "absl/synchronization/internal/thread_pool.h" namespace { TEST(ConfigTest, Endianness) { - union - { + union { uint32_t value; uint8_t data[sizeof(uint32_t)]; } number; @@ -41,4 +41,20 @@ TEST(ConfigTest, Endianness) { #endif } +#if defined(ABSL_HAVE_THREAD_LOCAL) +TEST(ConfigTest, ThreadLocal) { + static thread_local int mine_mine_mine = 16; + EXPECT_EQ(16, mine_mine_mine); + { + absl::synchronization_internal::ThreadPool pool(1); + pool.Schedule([&] { + EXPECT_EQ(16, mine_mine_mine); + mine_mine_mine = 32; + EXPECT_EQ(32, mine_mine_mine); + }); + } + EXPECT_EQ(16, mine_mine_mine); +} +#endif + } // namespace diff --git a/absl/base/optimization.h b/absl/base/optimization.h index db8beafa3..aaaffa495 100644 --- a/absl/base/optimization.h +++ b/absl/base/optimization.h @@ -46,6 +46,7 @@ // GCC will not tail call given inline volatile assembly. #define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __asm__ __volatile__("") #elif defined(_MSC_VER) +#include // The __nop() intrinsic blocks the optimisation. #define ABSL_BLOCK_TAIL_CALL_OPTIMIZATION() __nop() #else diff --git a/absl/container/fixed_array.h b/absl/container/fixed_array.h index 20bde2728..58240b499 100644 --- a/absl/container/fixed_array.h +++ b/absl/container/fixed_array.h @@ -120,7 +120,7 @@ class FixedArray { template = 0> FixedArray(Iter first, Iter last) : rep_(first, last) {} - // Create the array from an initializer_list. + // Creates the array from an initializer_list. FixedArray(std::initializer_list init_list) : FixedArray(init_list.begin(), init_list.end()) {} diff --git a/absl/numeric/int128.h b/absl/numeric/int128.h index bab5e2175..afb8bcf16 100644 --- a/absl/numeric/int128.h +++ b/absl/numeric/int128.h @@ -46,7 +46,7 @@ namespace absl { // that occurs, existing uses of `uint128` will continue to work using that new // type. // -// Note: code written with this type will continue to compile once `unint128_t` +// Note: code written with this type will continue to compile once `uint128_t` // is introduced, provided the replacement helper functions // `Uint128(Low|High)64()` and `MakeUint128()` are made. // diff --git a/absl/time/clock.cc b/absl/time/clock.cc index 9ffc1c4f9..6398170d0 100644 --- a/absl/time/clock.cc +++ b/absl/time/clock.cc @@ -368,7 +368,7 @@ static uint64_t UpdateLastSample( // into the fast past. That causes lots of register spills and reloads that // are unnecessary unless the slow path is taken. // -// TODO(absl-team) Remove this attribute when our compiler is smart enough +// TODO(absl-team): Remove this attribute when our compiler is smart enough // to do the right thing. ABSL_ATTRIBUTE_NOINLINE static int64_t GetCurrentTimeNanosSlowPath() LOCKS_EXCLUDED(lock) { diff --git a/absl/types/optional.h b/absl/types/optional.h index 8b56513fa..f1b41ace8 100644 --- a/absl/types/optional.h +++ b/absl/types/optional.h @@ -246,7 +246,7 @@ class optional_data_base : public optional_data_dtor_base { } }; -// TODO(absl-team) Add another class using +// TODO(absl-team): Add another class using // std::is_trivially_move_constructible trait when available to match // http://cplusplus.github.io/LWG/lwg-defects.html#2900, for types that // have trivial move but nontrivial copy.