diff --git a/absl/base/BUILD.bazel b/absl/base/BUILD.bazel index 562f843..e638bb4 100644 --- a/absl/base/BUILD.bazel +++ b/absl/base/BUILD.bazel
@@ -187,6 +187,7 @@ ], deps = [ ":base_internal", + ":config", ":core_headers", ":errno_saver", ], @@ -367,6 +368,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":atomic_hook", + ":config", ":core_headers", ], ) @@ -396,6 +398,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":base", + ":config", ":core_headers", "@googletest//:gtest", "@googletest//:gtest_main", @@ -656,6 +659,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":base", + ":config", ":core_headers", "//absl/synchronization", "@googletest//:gtest", @@ -778,6 +782,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":base", + ":config", "//absl/synchronization", "@googletest//:gtest", "@googletest//:gtest_main", @@ -809,6 +814,7 @@ "no_test_wasm", ], deps = [ + ":config", ":malloc_internal", "//absl/container:node_hash_map", ], @@ -824,6 +830,7 @@ ], deps = [ ":base", + ":config", ":core_headers", "//absl/synchronization", "@googletest//:gtest",
diff --git a/absl/base/attributes.h b/absl/base/attributes.h index 53e440e..7261417 100644 --- a/absl/base/attributes.h +++ b/absl/base/attributes.h
@@ -648,7 +648,11 @@ #ifdef ABSL_FALLTHROUGH_INTENDED #error "ABSL_FALLTHROUGH_INTENDED should not be defined." #endif -#define ABSL_FALLTHROUGH_INTENDED [[fallthrough]] +#define ABSL_FALLTHROUGH_INTENDED \ + struct [[deprecated( \ + "Use [[fallthrough]] instead.")]] _absl_fallthrough_intended_macro; \ + (void)sizeof(_absl_fallthrough_intended_macro*); \ + [[fallthrough]] // ABSL_DEPRECATED() //
diff --git a/absl/base/bit_cast_test.cc b/absl/base/bit_cast_test.cc index 8bded1d..21a2fdd 100644 --- a/absl/base/bit_cast_test.cc +++ b/absl/base/bit_cast_test.cc
@@ -20,6 +20,7 @@ #include "gtest/gtest.h" #include "absl/base/casts.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/base/call_once_test.cc b/absl/base/call_once_test.cc index 630e7ce..16f3c62 100644 --- a/absl/base/call_once_test.cc +++ b/absl/base/call_once_test.cc
@@ -19,6 +19,7 @@ #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/const_init.h" #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h"
diff --git a/absl/base/dynamic_annotations.h b/absl/base/dynamic_annotations.h index f18b5e0..1e679a6 100644 --- a/absl/base/dynamic_annotations.h +++ b/absl/base/dynamic_annotations.h
@@ -202,6 +202,7 @@ // Function prototypes of annotations provided by the compiler-based sanitizer // implementation. +#pragma GCC visibility push(default) ABSL_INTERNAL_BEGIN_EXTERN_C void AnnotateRWLockCreate(const char* file, int line, const volatile void* lock); @@ -221,6 +222,7 @@ void AnnotateThreadName(const char* file, int line, const char* name); void AnnotateEnableRaceDetection(const char* file, int line, int enable); ABSL_INTERNAL_END_EXTERN_C +#pragma GCC visibility pop #else // ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED == 0 @@ -297,12 +299,14 @@ // Function prototypes of annotations provided by the compiler-based sanitizer // implementation. +#pragma GCC visibility push(default) ABSL_INTERNAL_BEGIN_EXTERN_C void AnnotateIgnoreReadsBegin(const char* file, int line) ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE; void AnnotateIgnoreReadsEnd(const char* file, int line) ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE; ABSL_INTERNAL_END_EXTERN_C +#pragma GCC visibility pop #elif defined(ABSL_INTERNAL_ANNOTALYSIS_ENABLED) @@ -353,10 +357,12 @@ // Function prototypes of annotations provided by the compiler-based sanitizer // implementation. +#pragma GCC visibility push(default) ABSL_INTERNAL_BEGIN_EXTERN_C void AnnotateIgnoreWritesBegin(const char* file, int line); void AnnotateIgnoreWritesEnd(const char* file, int line); ABSL_INTERNAL_END_EXTERN_C +#pragma GCC visibility pop #else
diff --git a/absl/base/exception_safety_testing_test.cc b/absl/base/exception_safety_testing_test.cc index 7cf8c36..24b12d4 100644 --- a/absl/base/exception_safety_testing_test.cc +++ b/absl/base/exception_safety_testing_test.cc
@@ -20,7 +20,10 @@ #include <exception> #include <iostream> #include <list> +#include <memory> +#include <sstream> #include <type_traits> +#include <utility> #include <vector> #include "gtest/gtest-spi.h"
diff --git a/absl/base/internal/atomic_hook_test_helper.cc b/absl/base/internal/atomic_hook_test_helper.cc index 537d47c..5357aad 100644 --- a/absl/base/internal/atomic_hook_test_helper.cc +++ b/absl/base/internal/atomic_hook_test_helper.cc
@@ -15,6 +15,7 @@ #include "absl/base/internal/atomic_hook_test_helper.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/atomic_hook.h" namespace absl {
diff --git a/absl/base/internal/atomic_hook_test_helper.h b/absl/base/internal/atomic_hook_test_helper.h index c72015e..ce48f30 100644 --- a/absl/base/internal/atomic_hook_test_helper.h +++ b/absl/base/internal/atomic_hook_test_helper.h
@@ -15,6 +15,7 @@ #ifndef ABSL_BASE_INTERNAL_ATOMIC_HOOK_TEST_HELPER_H_ #define ABSL_BASE_INTERNAL_ATOMIC_HOOK_TEST_HELPER_H_ +#include "absl/base/config.h" #include "absl/base/internal/atomic_hook.h" namespace absl {
diff --git a/absl/base/internal/direct_mmap.h b/absl/base/internal/direct_mmap.h index f56ba23..855f51e 100644 --- a/absl/base/internal/direct_mmap.h +++ b/absl/base/internal/direct_mmap.h
@@ -54,7 +54,9 @@ // SYS_mmap and SYS_munmap are not defined in Android. #ifdef __BIONIC__ +#pragma GCC visibility push(default) extern "C" void* __mmap2(void*, size_t, int, int, int, size_t); +#pragma GCC visibility pop #if defined(__NR_mmap) && !defined(SYS_mmap) #define SYS_mmap __NR_mmap #endif
diff --git a/absl/base/internal/exception_safety_testing.cc b/absl/base/internal/exception_safety_testing.cc index 6ccac41..b358b2d 100644 --- a/absl/base/internal/exception_safety_testing.cc +++ b/absl/base/internal/exception_safety_testing.cc
@@ -12,12 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #include "absl/base/internal/exception_safety_testing.h" #ifdef ABSL_HAVE_EXCEPTIONS +#include <string> + #include "gtest/gtest.h" #include "absl/meta/type_traits.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" namespace testing {
diff --git a/absl/base/internal/exception_safety_testing.h b/absl/base/internal/exception_safety_testing.h index 7082da7..e600b85 100644 --- a/absl/base/internal/exception_safety_testing.h +++ b/absl/base/internal/exception_safety_testing.h
@@ -25,17 +25,25 @@ #include <cstddef> #include <cstdint> +#include <cstdlib> #include <functional> #include <initializer_list> #include <iosfwd> +#include <limits> +#include <memory> +#include <new> #include <string> #include <tuple> +#include <type_traits> #include <unordered_map> +#include <utility> +#include <vector> #include "gtest/gtest.h" #include "absl/base/internal/pretty_function.h" #include "absl/memory/memory.h" #include "absl/meta/type_traits.h" +#include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/strings/substitute.h" #include "absl/utility/utility.h" @@ -1029,10 +1037,10 @@ ExceptionSafetyTestBuilder<Factory, Operation, Contracts..., std::decay_t<MoreContracts>...> WithContracts(const MoreContracts&... more_contracts) const { - return { - factory_, operation_, - std::tuple_cat(contracts_, std::tuple<std::decay_t<MoreContracts>...>( - more_contracts...))}; + return {factory_, operation_, + std::tuple_cat( + contracts_, + std::tuple<std::decay_t<MoreContracts>...>(more_contracts...))}; } /*
diff --git a/absl/base/internal/hardening.h b/absl/base/internal/hardening.h index 26957a3..b86f884 100644 --- a/absl/base/internal/hardening.h +++ b/absl/base/internal/hardening.h
@@ -23,6 +23,7 @@ #ifndef ABSL_BASE_INTERNAL_HARDENING_H_ #define ABSL_BASE_INTERNAL_HARDENING_H_ +#include <atomic> #include <cstddef> #include "absl/base/config.h"
diff --git a/absl/base/internal/low_level_alloc_test.cc b/absl/base/internal/low_level_alloc_test.cc index 3282076..2f3a3fd 100644 --- a/absl/base/internal/low_level_alloc_test.cc +++ b/absl/base/internal/low_level_alloc_test.cc
@@ -19,9 +19,8 @@ #include <stdlib.h> #include <thread> // NOLINT(build/c++11) -#include <unordered_map> -#include <utility> +#include "absl/base/config.h" #include "absl/container/node_hash_map.h" #ifdef __EMSCRIPTEN__
diff --git a/absl/base/internal/low_level_scheduling.h b/absl/base/internal/low_level_scheduling.h index 04e44e9..ed832ba 100644 --- a/absl/base/internal/low_level_scheduling.h +++ b/absl/base/internal/low_level_scheduling.h
@@ -21,6 +21,7 @@ #include <atomic> #include <cstdint> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/scheduling_mode.h" #include "absl/base/internal/thread_identity.h"
diff --git a/absl/base/internal/scoped_set_env.cc b/absl/base/internal/scoped_set_env.cc index b13e7a2..ee5e4f9 100644 --- a/absl/base/internal/scoped_set_env.cc +++ b/absl/base/internal/scoped_set_env.cc
@@ -16,6 +16,7 @@ #include <cstdlib> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #ifdef _WIN32
diff --git a/absl/base/internal/spinlock_wait.cc b/absl/base/internal/spinlock_wait.cc index fa824be..ca5492b 100644 --- a/absl/base/internal/spinlock_wait.cc +++ b/absl/base/internal/spinlock_wait.cc
@@ -16,10 +16,12 @@ // AbslInternalSpinLockDelay() and AbslInternalSpinLockWake(). // See spinlock_wait.h for the specs. +#include "absl/base/internal/spinlock_wait.h" + #include <atomic> #include <cstdint> -#include "absl/base/internal/spinlock_wait.h" +#include "absl/base/config.h" #if defined(_WIN32) #include "absl/base/internal/spinlock_win32.inc"
diff --git a/absl/base/internal/spinlock_wait.h b/absl/base/internal/spinlock_wait.h index 9a1adcd..2c607eb 100644 --- a/absl/base/internal/spinlock_wait.h +++ b/absl/base/internal/spinlock_wait.h
@@ -19,8 +19,10 @@ // waiting for those transitions to become possible. #include <stdint.h> + #include <atomic> +#include "absl/base/config.h" #include "absl/base/internal/scheduling_mode.h" namespace absl {
diff --git a/absl/base/internal/strerror.cc b/absl/base/internal/strerror.cc index e9c4c23..9159440 100644 --- a/absl/base/internal/strerror.cc +++ b/absl/base/internal/strerror.cc
@@ -22,6 +22,7 @@ #include <string> #include <type_traits> +#include "absl/base/config.h" #include "absl/base/internal/errno_saver.h" namespace absl {
diff --git a/absl/base/internal/sysinfo_test.cc b/absl/base/internal/sysinfo_test.cc index 7248fde..985cd2b 100644 --- a/absl/base/internal/sysinfo_test.cc +++ b/absl/base/internal/sysinfo_test.cc
@@ -19,6 +19,7 @@ #include <vector> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/synchronization/barrier.h" #include "absl/synchronization/mutex.h"
diff --git a/absl/base/internal/thread_identity.cc b/absl/base/internal/thread_identity.cc index 27b5816..a9d38d3 100644 --- a/absl/base/internal/thread_identity.cc +++ b/absl/base/internal/thread_identity.cc
@@ -20,10 +20,11 @@ #include "absl/base/attributes.h" #include "absl/base/call_once.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/internal/spinlock.h" -#if !defined(_WIN32) || defined(__MINGW32__) +#if ABSL_THREAD_IDENTITY_MODE != ABSL_THREAD_IDENTITY_MODE_USE_CPP11 #include <pthread.h> #ifndef __wasi__ // WASI does not provide this header, either way we disable use @@ -86,7 +87,7 @@ #if defined(__wasi__) || defined(__EMSCRIPTEN__) || defined(__MINGW32__) || \ defined(__hexagon__) - // Emscripten, WASI and MinGW pthread implementations does not support + // Emscripten, WASI and MinGW pthread implementations do not support // signals. See // https://kripken.github.io/emscripten-site/docs/porting/pthreads.html for // more information.
diff --git a/absl/base/internal/thread_identity_test.cc b/absl/base/internal/thread_identity_test.cc index 94beaa8..428de02 100644 --- a/absl/base/internal/thread_identity_test.cc +++ b/absl/base/internal/thread_identity_test.cc
@@ -20,6 +20,7 @@ #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/spinlock.h" #include "absl/base/macros.h" #include "absl/base/thread_annotations.h"
diff --git a/absl/base/internal/unscaledcycleclock.cc b/absl/base/internal/unscaledcycleclock.cc index 9e93180..02ae823 100644 --- a/absl/base/internal/unscaledcycleclock.cc +++ b/absl/base/internal/unscaledcycleclock.cc
@@ -14,6 +14,7 @@ #include "absl/base/internal/unscaledcycleclock.h" +#include "absl/base/config.h" #include "absl/base/internal/unscaledcycleclock_config.h" #if ABSL_USE_UNSCALED_CYCLECLOCK @@ -99,9 +100,12 @@ static once_flag init_timebase_frequency_once; static double timebase_frequency = 0.0; base_internal::LowLevelCallOnce(&init_timebase_frequency_once, [&]() { - size_t length = sizeof(timebase_frequency); - sysctlbyname("kern.timecounter.tc.timebase.frequency", &timebase_frequency, - &length, nullptr, 0); + uint64_t freq = 0; + size_t length = sizeof(freq); + if (sysctlbyname("kern.timecounter.tc.timebase.frequency", &freq, &length, + nullptr, 0) == 0) { + timebase_frequency = static_cast<double>(freq); + } }); return timebase_frequency; #else
diff --git a/absl/cleanup/BUILD.bazel b/absl/cleanup/BUILD.bazel index dad0d6b..da9a9be 100644 --- a/absl/cleanup/BUILD.bazel +++ b/absl/cleanup/BUILD.bazel
@@ -39,6 +39,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, visibility = ["//visibility:public"], # Should be private, but cleanup is required. deps = [ + "//absl/base:config", "//absl/base:core_headers", "//absl/base:hardening", "//absl/utility", @@ -70,6 +71,7 @@ copts = ABSL_TEST_COPTS, deps = [ ":cleanup", + ":cleanup_internal", "//absl/base:config", "//absl/utility", "@googletest//:gtest",
diff --git a/absl/cleanup/cleanup_test.cc b/absl/cleanup/cleanup_test.cc index a413b7e..500dc7a 100644 --- a/absl/cleanup/cleanup_test.cc +++ b/absl/cleanup/cleanup_test.cc
@@ -20,6 +20,7 @@ #include "gtest/gtest.h" #include "absl/base/config.h" +#include "absl/cleanup/internal/cleanup.h" #include "absl/utility/utility.h" namespace {
diff --git a/absl/cleanup/internal/cleanup.h b/absl/cleanup/internal/cleanup.h index f078323..3dfb345 100644 --- a/absl/cleanup/internal/cleanup.h +++ b/absl/cleanup/internal/cleanup.h
@@ -19,6 +19,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/base/internal/hardening.h" #include "absl/base/macros.h" #include "absl/base/thread_annotations.h"
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel index 99b1f53..91f79d6 100644 --- a/absl/container/BUILD.bazel +++ b/absl/container/BUILD.bazel
@@ -42,6 +42,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, visibility = ["//visibility:public"], # Should be private, but cleanup is required. deps = [ + "//absl/base:config", "//absl/utility", ], ) @@ -54,6 +55,7 @@ deps = [ ":compressed_tuple", ":test_instance_tracker", + "//absl/base:config", "//absl/memory", "//absl/utility", "@googletest//:gtest", @@ -152,6 +154,7 @@ deps = [ ":inlined_vector_internal", "//absl/algorithm", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:hardening", "//absl/base:iterator_traits_internal", @@ -236,7 +239,10 @@ "//absl:__subpackages__", "@do_not_use_for_gloop_visibility_only//gloop/util/gtl:__subpackages__", ], - deps = ["//absl/types:compare"], + deps = [ + "//absl/base:config", + "//absl/types:compare", + ], ) cc_test( @@ -269,6 +275,7 @@ ":hash_container_defaults", ":raw_hash_map", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:core_headers", "//absl/meta:type_traits", ], @@ -308,6 +315,7 @@ ":hash_container_defaults", ":raw_hash_set", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:core_headers", "//absl/memory", "//absl/meta:type_traits", @@ -353,6 +361,7 @@ ":node_slot_policy", ":raw_hash_map", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:core_headers", "//absl/memory", "//absl/meta:type_traits", @@ -391,6 +400,7 @@ ":node_slot_policy", ":raw_hash_set", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:core_headers", "//absl/memory", "//absl/meta:type_traits", @@ -495,6 +505,7 @@ ":flat_hash_map", ":flat_hash_set", ":hash_function_defaults", + "//absl/base:config", "//absl/base:core_headers", "//absl/hash", "//absl/random", @@ -534,6 +545,7 @@ "@do_not_use_for_gloop_visibility_only//gloop/util/gtl:__subpackages__", ], deps = [ + "//absl/base:config", "//absl/hash", "//absl/strings:string_view", ], @@ -546,6 +558,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":hash_policy_testing", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -559,6 +572,7 @@ deps = [ ":common_policy_traits", ":container_memory", + "//absl/base:config", "//absl/meta:type_traits", ], ) @@ -571,6 +585,7 @@ deps = [ ":container_memory", ":hash_policy_traits", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -582,7 +597,10 @@ copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, visibility = ["//visibility:private"], - deps = ["//absl/meta:type_traits"], + deps = [ + "//absl/base:config", + "//absl/meta:type_traits", + ], ) cc_test( @@ -605,6 +623,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":hashtable_debug_hooks", + "//absl/base:config", ], ) @@ -726,6 +745,7 @@ "@do_not_use_for_gloop_visibility_only//gloop/util/gtl:__pkg__", ], deps = [ + "//absl/base:config", "//absl/meta:type_traits", "//absl/types:optional", ], @@ -876,6 +896,7 @@ ":hash_function_defaults", ":hashtable_control_bytes", ":raw_hash_set", + "//absl/base:config", "//absl/base:raw_logging_internal", "//absl/hash", "//absl/random", @@ -971,6 +992,7 @@ visibility = ["//visibility:private"], deps = [ ":layout", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "@google_benchmark//:benchmark_main", @@ -1019,6 +1041,7 @@ deps = [ ":hash_generator_testing", ":hash_policy_testing", + "//absl/base:config", "@googletest//:gtest", ], ) @@ -1036,6 +1059,7 @@ deps = [ ":hash_generator_testing", ":hash_policy_testing", + "//absl/base:config", "@googletest//:gtest", ], ) @@ -1069,6 +1093,7 @@ "//absl/container:__pkg__", ], deps = [ + "//absl/base:config", "//absl/meta:type_traits", "@googletest//:gtest", ], @@ -1084,6 +1109,7 @@ "//absl/container:__pkg__", ], deps = [ + "//absl/base:config", "//absl/meta:type_traits", "@googletest//:gtest", ], @@ -1102,6 +1128,7 @@ deps = [ ":hash_generator_testing", ":hash_policy_testing", + "//absl/base:config", "@googletest//:gtest", ], ) @@ -1119,6 +1146,7 @@ deps = [ ":hash_generator_testing", ":hash_policy_testing", + "//absl/base:config", "@googletest//:gtest", ], ) @@ -1135,6 +1163,7 @@ ":unordered_set_lookup_test", ":unordered_set_members_test", ":unordered_set_modifiers_test", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -1152,6 +1181,7 @@ ":unordered_map_lookup_test", ":unordered_map_members_test", ":unordered_map_modifiers_test", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -1170,6 +1200,7 @@ ":hashtablez_sampler", ":node_hash_map", ":node_hash_set", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -1218,6 +1249,7 @@ deps = [ ":btree", ":flat_hash_set", + "//absl/base:config", "//absl/strings:cord", "//absl/time", ], @@ -1244,6 +1276,7 @@ ":test_allocator", ":test_instance_tracker", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", "//absl/flags:flag", @@ -1276,6 +1309,7 @@ ":flat_hash_set", ":hashtable_debug", "//absl/algorithm:container", + "//absl/base:config", "//absl/base:raw_logging_internal", "//absl/hash", "//absl/log",
diff --git a/absl/container/btree_benchmark.cc b/absl/container/btree_benchmark.cc index 97931da..9ccee4d 100644 --- a/absl/container/btree_benchmark.cc +++ b/absl/container/btree_benchmark.cc
@@ -31,6 +31,7 @@ #include <vector> #include "absl/algorithm/container.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/container/btree_map.h" #include "absl/container/btree_set.h"
diff --git a/absl/container/btree_map.h b/absl/container/btree_map.h index 257a624..0aaf2e7 100644 --- a/absl/container/btree_map.h +++ b/absl/container/btree_map.h
@@ -63,6 +63,7 @@ #include <utility> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/container/internal/btree.h" // IWYU pragma: export #include "absl/container/internal/btree_container.h" // IWYU pragma: export #include "absl/container/internal/common.h"
diff --git a/absl/container/btree_set.h b/absl/container/btree_set.h index 368c6a7..892dc88 100644 --- a/absl/container/btree_set.h +++ b/absl/container/btree_set.h
@@ -62,6 +62,7 @@ #include <utility> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/container/internal/btree.h" // IWYU pragma: export #include "absl/container/internal/btree_container.h" // IWYU pragma: export #include "absl/container/internal/common.h"
diff --git a/absl/container/btree_test.cc b/absl/container/btree_test.cc index 9bcedc5..a2c8648 100644 --- a/absl/container/btree_test.cc +++ b/absl/container/btree_test.cc
@@ -36,6 +36,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/algorithm/container.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" #include "absl/container/btree_map.h"
diff --git a/absl/container/btree_test.h b/absl/container/btree_test.h index 79c3d95..da1618e 100644 --- a/absl/container/btree_test.h +++ b/absl/container/btree_test.h
@@ -23,6 +23,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/container/btree_map.h" #include "absl/container/btree_set.h" #include "absl/container/flat_hash_set.h"
diff --git a/absl/container/flat_hash_map.h b/absl/container/flat_hash_map.h index e11d7e2..8233409 100644 --- a/absl/container/flat_hash_map.h +++ b/absl/container/flat_hash_map.h
@@ -39,6 +39,7 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/container/hash_container_defaults.h" #include "absl/container/internal/container_memory.h"
diff --git a/absl/container/flat_hash_set.h b/absl/container/flat_hash_set.h index ed97743..b0527b3 100644 --- a/absl/container/flat_hash_set.h +++ b/absl/container/flat_hash_set.h
@@ -39,6 +39,7 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/container/hash_container_defaults.h" #include "absl/container/internal/container_memory.h" @@ -588,9 +589,9 @@ static size_t space_used(const T*) { return 0; } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { - return &TypeErasedApplyToSlotFn<Hash, T, kIsDefault, kSeedShift>; + return &TypeErasedApplyToSlotFn<Hash, T, kIsAbsl, kSeedShift>; } }; } // namespace container_internal
diff --git a/absl/container/flat_hash_set_test.cc b/absl/container/flat_hash_set_test.cc index c5878aa..6c99e8d 100644 --- a/absl/container/flat_hash_set_test.cc +++ b/absl/container/flat_hash_set_test.cc
@@ -389,14 +389,14 @@ TEST(FlatHashSet, IsDefaultHash) { using absl::container_internal::hashtable_debug_internal:: HashtableDebugAccess; - EXPECT_EQ(HashtableDebugAccess<flat_hash_set<int>>::kIsDefaultHash, true); - EXPECT_EQ(HashtableDebugAccess<flat_hash_set<std::string>>::kIsDefaultHash, + EXPECT_EQ(HashtableDebugAccess<flat_hash_set<int>>::kIsAbslHash, true); + EXPECT_EQ(HashtableDebugAccess<flat_hash_set<std::string>>::kIsAbslHash, true); struct Hash { size_t operator()(size_t i) const { return i; } }; - EXPECT_EQ((HashtableDebugAccess<flat_hash_set<size_t, Hash>>::kIsDefaultHash), + EXPECT_EQ((HashtableDebugAccess<flat_hash_set<size_t, Hash>>::kIsAbslHash), false); }
diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h index 549151d..f777f1f 100644 --- a/absl/container/inlined_vector.h +++ b/absl/container/inlined_vector.h
@@ -48,6 +48,7 @@ #include "absl/algorithm/algorithm.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/hardening.h" #include "absl/base/internal/iterator_traits.h" #include "absl/base/macros.h"
diff --git a/absl/container/internal/btree_container.h b/absl/container/internal/btree_container.h index 8a4582f..eb7dfd1 100644 --- a/absl/container/internal/btree_container.h +++ b/absl/container/internal/btree_container.h
@@ -23,6 +23,7 @@ #include <utility> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/throw_delegate.h" #include "absl/container/internal/btree.h" // IWYU pragma: export #include "absl/container/internal/common.h"
diff --git a/absl/container/internal/common.h b/absl/container/internal/common.h index b2839e6..c438068 100644 --- a/absl/container/internal/common.h +++ b/absl/container/internal/common.h
@@ -22,6 +22,7 @@ #include <tuple> #include <type_traits> +#include "absl/base/config.h" #include "absl/meta/type_traits.h" #include "absl/types/optional.h"
diff --git a/absl/container/internal/common_policy_traits.h b/absl/container/internal/common_policy_traits.h index 0eb0542..2d65fe7 100644 --- a/absl/container/internal/common_policy_traits.h +++ b/absl/container/internal/common_policy_traits.h
@@ -22,6 +22,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/meta/type_traits.h" namespace absl {
diff --git a/absl/container/internal/compressed_tuple.h b/absl/container/internal/compressed_tuple.h index 5d7567d..fa53636 100644 --- a/absl/container/internal/compressed_tuple.h +++ b/absl/container/internal/compressed_tuple.h
@@ -38,6 +38,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/utility/utility.h" #if defined(_MSC_VER) && !defined(__NVCC__)
diff --git a/absl/container/internal/compressed_tuple_test.cc b/absl/container/internal/compressed_tuple_test.cc index 2331fc4..e22fafa 100644 --- a/absl/container/internal/compressed_tuple_test.cc +++ b/absl/container/internal/compressed_tuple_test.cc
@@ -25,6 +25,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/test_instance_tracker.h" #include "absl/memory/memory.h" #include "absl/utility/utility.h"
diff --git a/absl/container/internal/container_memory.h b/absl/container/internal/container_memory.h index fceb4eb..b03eb95 100644 --- a/absl/container/internal/container_memory.h +++ b/absl/container/internal/container_memory.h
@@ -486,13 +486,13 @@ // Variadic arguments hash function that ignore the rest of the arguments. // Useful for usage with policy traits. -template <class Hash, bool kIsDefault, size_t kSeedShift> +template <class Hash, bool kIsAbsl, size_t kSeedShift> struct HashElement { HashElement(const Hash& h, size_t s) : hash(h), seed(s >> kSeedShift) {} template <class K, class... Args> size_t operator()(const K& key, Args&&...) const { - if constexpr (kIsDefault) { + if constexpr (kIsAbsl) { // TODO(b/384509507): resolve `no header providing // "absl::hash_internal::SupportsHashWithSeed" is directly included`. // Maybe we should make "internal/hash.h" be a separate library. @@ -506,12 +506,12 @@ }; // No arguments function hash function for a specific key. -template <class Hash, class Key, bool kIsDefault, size_t kSeedShift> +template <class Hash, class Key, bool kIsAbsl, size_t kSeedShift> struct HashKey { HashKey(const Hash& h, const Key& k) : hash(h), key(k) {} size_t operator()(size_t seed) const { - return HashElement<Hash, kIsDefault, kSeedShift>{hash, seed}(key); + return HashElement<Hash, kIsAbsl, kSeedShift>{hash, seed}(key); } const Hash& hash; const Key& key; @@ -534,31 +534,31 @@ // Type erased function to apply `Fn` to data inside of the `slot`. // The data is expected to have type `T`. -template <class Fn, class T, bool kIsDefault, size_t kSeedShift> +template <class Fn, class T, bool kIsAbsl, size_t kSeedShift> size_t TypeErasedApplyToSlotFn(const void* fn, void* slot, size_t seed) { const auto* f = static_cast<const Fn*>(fn); - return HashElement<Fn, kIsDefault, kSeedShift>{ + return HashElement<Fn, kIsAbsl, kSeedShift>{ *f, seed}(*static_cast<const T*>(slot)); } // Type erased function to apply `Fn` to data inside of the `*slot_ptr`. // The data is expected to have type `T`. -template <class Fn, class T, bool kIsDefault, size_t kSeedShift> +template <class Fn, class T, bool kIsAbsl, size_t kSeedShift> size_t TypeErasedDerefAndApplyToSlotFn(const void* fn, void* slot_ptr, size_t seed) { const auto* f = static_cast<const Fn*>(fn); const T* slot = *static_cast<T**>(slot_ptr); - return HashElement<Fn, kIsDefault, kSeedShift>{*f, seed}(*slot); + return HashElement<Fn, kIsAbsl, kSeedShift>{*f, seed}(*slot); } // Type erased function to apply `Fn` to data inside of the `slot_ptr->first`. // The data is expected to have type `T`. -template <class Fn, class T, bool kIsDefault, size_t kSeedShift> +template <class Fn, class T, bool kIsAbsl, size_t kSeedShift> size_t TypeErasedDerefAndApplyToSlotFirstFn(const void* fn, void* slot_ptr, size_t seed) { const auto* f = static_cast<const Fn*>(fn); const T* slot = *static_cast<T**>(slot_ptr); - return HashElement<Fn, kIsDefault, kSeedShift>{*f, seed}(slot->first); + return HashElement<Fn, kIsAbsl, kSeedShift>{*f, seed}(slot->first); } } // namespace container_internal
diff --git a/absl/container/internal/container_memory_test.cc b/absl/container/internal/container_memory_test.cc index 9ed387a..70fc0ea 100644 --- a/absl/container/internal/container_memory_test.cc +++ b/absl/container/internal/container_memory_test.cc
@@ -316,9 +316,9 @@ size_t x = 7; size_t seed = 100; auto fn = [](size_t v) { return v * 2; }; - EXPECT_EQ((TypeErasedApplyToSlotFn<decltype(fn), size_t, /*kIsDefault=*/false, + EXPECT_EQ((TypeErasedApplyToSlotFn<decltype(fn), size_t, /*kIsAbsl=*/false, /*kSeedShift=*/0>(&fn, &x, seed)), - (HashElement<decltype(fn), /*kIsDefault=*/false, /*kSeedShift=*/0>( + (HashElement<decltype(fn), /*kIsAbsl=*/false, /*kSeedShift=*/0>( fn, seed)(x))); } @@ -329,9 +329,9 @@ size_t* x_ptr = &x; EXPECT_EQ( (TypeErasedDerefAndApplyToSlotFn<decltype(fn), size_t, - /*kIsDefault=*/false, + /*kIsAbsl=*/false, /*kSeedShift=*/0>(&fn, &x_ptr, seed)), - (HashElement<decltype(fn), /*kIsDefault=*/false, /*kSeedShift=*/0>( + (HashElement<decltype(fn), /*kIsAbsl=*/false, /*kSeedShift=*/0>( fn, seed)(x))); } @@ -344,7 +344,7 @@ return v * 2 + seed * 3; } } hash; - EXPECT_EQ((HashElement<HashWithSeed, /*kIsDefault=*/true, + EXPECT_EQ((HashElement<HashWithSeed, /*kIsAbsl=*/true, /*kSeedShift=*/0>(hash, seed)(x)), hash.hash_with_seed(x, seed)); } @@ -354,7 +354,7 @@ size_t seed = 100; auto fn = [](size_t v) { return v * 2; }; EXPECT_EQ( - (HashElement<decltype(fn), /*kIsDefault=*/false, /*kSeedShift=*/0>( + (HashElement<decltype(fn), /*kIsAbsl=*/false, /*kSeedShift=*/0>( fn, seed)(x)), fn(x) ^ seed); } @@ -364,7 +364,7 @@ size_t seed = 100; auto fn = [](size_t v) { return v * 2; }; EXPECT_EQ( - (HashElement<decltype(fn), /*kIsDefault=*/false, /*kSeedShift=*/1>( + (HashElement<decltype(fn), /*kIsAbsl=*/false, /*kSeedShift=*/1>( fn, seed)(x)), fn(x) ^ (seed >> 1)); }
diff --git a/absl/container/internal/hash_function_defaults_test.cc b/absl/container/internal/hash_function_defaults_test.cc index f1c9ccc..64a5a04 100644 --- a/absl/container/internal/hash_function_defaults_test.cc +++ b/absl/container/internal/hash_function_defaults_test.cc
@@ -26,6 +26,7 @@ #include <vector> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/port.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h"
diff --git a/absl/container/internal/hash_generator_testing.cc b/absl/container/internal/hash_generator_testing.cc index 4ae58da..6dbd3f1 100644 --- a/absl/container/internal/hash_generator_testing.cc +++ b/absl/container/internal/hash_generator_testing.cc
@@ -19,6 +19,7 @@ #include <random> #include <string> +#include "absl/base/config.h" #include "absl/base/no_destructor.h" #include "absl/random/random.h" #include "absl/strings/string_view.h"
diff --git a/absl/container/internal/hash_policy_testing.h b/absl/container/internal/hash_policy_testing.h index b7cab68..09617b3 100644 --- a/absl/container/internal/hash_policy_testing.h +++ b/absl/container/internal/hash_policy_testing.h
@@ -27,6 +27,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/hash/hash.h" #include "absl/strings/string_view.h"
diff --git a/absl/container/internal/hash_policy_testing_test.cc b/absl/container/internal/hash_policy_testing_test.cc index d932b0f..1f0362c 100644 --- a/absl/container/internal/hash_policy_testing_test.cc +++ b/absl/container/internal/hash_policy_testing_test.cc
@@ -17,6 +17,7 @@ #include <utility> #include "gtest/gtest.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/container/internal/hash_policy_traits.h b/absl/container/internal/hash_policy_traits.h index beed150..acea6b7 100644 --- a/absl/container/internal/hash_policy_traits.h +++ b/absl/container/internal/hash_policy_traits.h
@@ -21,6 +21,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/container/internal/common_policy_traits.h" #include "absl/container/internal/container_memory.h" #include "absl/meta/type_traits.h" @@ -146,7 +147,7 @@ return P::value(elem); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { // get_hash_slot_fn may return nullptr to signal that non type erased function // should be used. GCC warns against comparing function address with nullptr. @@ -155,10 +156,10 @@ // silent error: the address of * will never be NULL [-Werror=address] #pragma GCC diagnostic ignored "-Waddress" #endif - return Policy::template get_hash_slot_fn<Hash, kIsDefault, kSeedShift>() == + return Policy::template get_hash_slot_fn<Hash, kIsAbsl, kSeedShift>() == nullptr - ? &hash_slot_fn_non_type_erased<Hash, kIsDefault, kSeedShift> - : Policy::template get_hash_slot_fn<Hash, kIsDefault, + ? &hash_slot_fn_non_type_erased<Hash, kIsAbsl, kSeedShift> + : Policy::template get_hash_slot_fn<Hash, kIsAbsl, kSeedShift>(); #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic pop @@ -169,11 +170,11 @@ static constexpr bool soo_enabled() { return soo_enabled_impl(Rank1{}); } private: - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static size_t hash_slot_fn_non_type_erased(const void* hash_fn, void* slot, size_t seed) { return Policy::apply( - HashElement<Hash, kIsDefault, kSeedShift>{ + HashElement<Hash, kIsAbsl, kSeedShift>{ *static_cast<const Hash*>(hash_fn), seed}, Policy::element(static_cast<slot_type*>(slot))); }
diff --git a/absl/container/internal/hash_policy_traits_test.cc b/absl/container/internal/hash_policy_traits_test.cc index 8d498e0..ebe8074 100644 --- a/absl/container/internal/hash_policy_traits_test.cc +++ b/absl/container/internal/hash_policy_traits_test.cc
@@ -21,6 +21,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/container_memory.h" namespace absl { @@ -45,7 +46,7 @@ static std::function<int(int)> apply_impl; static std::function<Slot&(Slot*)> value; - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -99,7 +100,7 @@ return fn(v); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -108,9 +109,9 @@ size_t* PolicyNoHashFn::apply_called_count; struct PolicyCustomHashFn : PolicyNoHashFn { - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { - return &TypeErasedApplyToSlotFn<Hash, int, kIsDefault, kSeedShift>; + return &TypeErasedApplyToSlotFn<Hash, int, kIsAbsl, kSeedShift>; } }; @@ -121,10 +122,10 @@ Hash hasher; Slot value = 7; auto* fn = hash_policy_traits<PolicyNoHashFn>::get_hash_slot_fn< - Hash, /*kIsDefault=*/false, /*kSeedShift=*/6>(); + Hash, /*kIsAbsl=*/false, /*kSeedShift=*/6>(); EXPECT_NE(fn, nullptr); EXPECT_EQ(fn(&hasher, &value, 100), - (HashElement<Hash, /*kIsDefault=*/false, /*kSeedShift=*/6>( + (HashElement<Hash, /*kIsAbsl=*/false, /*kSeedShift=*/6>( hasher, 100)(value))); EXPECT_EQ(apply_called_count, 1); } @@ -136,12 +137,12 @@ Hash hasher; Slot value = 7; auto* fn = hash_policy_traits<PolicyCustomHashFn>::get_hash_slot_fn< - Hash, /*kIsDefault=*/false, /*kSeedShift=*/6>(); + Hash, /*kIsAbsl=*/false, /*kSeedShift=*/6>(); EXPECT_EQ(fn, - (PolicyCustomHashFn::get_hash_slot_fn<Hash, /*kIsDefault=*/false, + (PolicyCustomHashFn::get_hash_slot_fn<Hash, /*kIsAbsl=*/false, /*kSeedShift=*/6>())); EXPECT_EQ(fn(&hasher, &value, 100), - (HashElement<Hash, /*kIsDefault=*/false, /*kSeedShift=*/6>( + (HashElement<Hash, /*kIsAbsl=*/false, /*kSeedShift=*/6>( hasher, 100)(value))); EXPECT_EQ(apply_called_count, 0); }
diff --git a/absl/container/internal/hashtable_debug.h b/absl/container/internal/hashtable_debug.h index c79c1a9..1b2bc95 100644 --- a/absl/container/internal/hashtable_debug.h +++ b/absl/container/internal/hashtable_debug.h
@@ -30,11 +30,12 @@ #ifndef ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_H_ #define ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_H_ -#include <cstddef> #include <algorithm> +#include <cstddef> #include <type_traits> #include <vector> +#include "absl/base/config.h" #include "absl/container/internal/hashtable_debug_hooks.h" namespace absl {
diff --git a/absl/container/internal/hashtablez_sampler_force_weak_definition.cc b/absl/container/internal/hashtablez_sampler_force_weak_definition.cc index ed35a7e..01cd3b1 100644 --- a/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +++ b/absl/container/internal/hashtablez_sampler_force_weak_definition.cc
@@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "absl/container/internal/hashtablez_sampler.h" - #include "absl/base/attributes.h" +#include "absl/base/config.h" +#include "absl/container/internal/hashtablez_sampler.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/container/internal/layout_benchmark.cc b/absl/container/internal/layout_benchmark.cc index d6f2669..b427f95 100644 --- a/absl/container/internal/layout_benchmark.cc +++ b/absl/container/internal/layout_benchmark.cc
@@ -18,6 +18,7 @@ #include <cstddef> #include <cstdint> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/container/internal/layout.h" #include "benchmark/benchmark.h"
diff --git a/absl/container/internal/raw_hash_set.cc b/absl/container/internal/raw_hash_set.cc index 04c0448..fb68468 100644 --- a/absl/container/internal/raw_hash_set.cc +++ b/absl/container/internal/raw_hash_set.cc
@@ -22,6 +22,7 @@ #include <cstring> #include <memory> #include <tuple> +#include <type_traits> #include <utility> #include "absl/base/attributes.h" @@ -327,9 +328,9 @@ inline_data_.set_growth_info_lower_bound( GrowthInfoLowerBound(static_cast<uint8_t>(growth_left))); } else { - uint64_t lower_bound = - (std::min)(uint64_t{growth_left}, - GrowthInfoLowerBound::kMaxGrowthLeftLowerBound); + size_t lower_bound = (std::min)( + growth_left, + GrowthInfoLowerBound::kMaxGrowthLeftLowerBound); inline_data_.set_growth_info_lower_bound( GrowthInfoLowerBound(static_cast<uint8_t>(lower_bound))); SetGrowthInfoOverflow(growth_left - lower_bound); @@ -368,9 +369,9 @@ ABSL_ATTRIBUTE_NOINLINE GrowthInfoLowerBound CommonFields::RebalanceGrowthLeftLowerBoundLargeCapacity() { - uint64_t overflow_growth_left = GetOverflowGrowthLeft(); - uint64_t lower_bound_growth_left = GetGrowthLeftLowerBound(); - uint64_t overflow_to_lower_bound_size = + size_t overflow_growth_left = GetOverflowGrowthLeft(); + size_t lower_bound_growth_left = GetGrowthLeftLowerBound(); + size_t overflow_to_lower_bound_size = (std::min)(overflow_growth_left, GrowthInfoLowerBound::kMaxGrowthLeftLowerBound - lower_bound_growth_left); @@ -404,6 +405,41 @@ } namespace { +void DeallocBackingArrayImpl(void* alloc, size_t capacity, ctrl_t* ctrl, + size_t slot_size, size_t slot_align, + bool has_infoz, size_t blocked_element_count, + DeallocBackingArrayFn dealloc) { + RawHashSetLayout layout(capacity, slot_size, slot_align, has_infoz, + blocked_element_count); + void* backing_array = ctrl - layout.control_offset(); + // Unpoison before returning the memory to the allocator. + SanitizerUnpoisonMemoryRegion(backing_array, layout.alloc_size()); + dealloc(alloc, backing_array, layout.alloc_size()); +} + +void DeallocBackingArrayImpl(CommonFields& c, + const PolicyFunctions& __restrict policy, + void* alloc) { + DeallocBackingArrayImpl(alloc, c.capacity(), c.control(), policy.slot_size, + policy.slot_align, c.has_infoz(), + c.blocked_element_count(), policy.dealloc); +} + +} // namespace + +void UnregisterAndDeallocBackingArray(CommonFields& c, + const DtorPolicy& __restrict policy, + DeallocBackingArrayFn dealloc, + void* alloc) { + size_t cap = c.capacity(); // capacity is already in register, so storing it + // in a local variable before Unregister(). + c.infoz().Unregister(); + DeallocBackingArrayImpl(alloc, cap, c.control(), policy.slot_size, + policy.slot_align, c.has_infoz(), + c.blocked_element_count(), dealloc); +} + +namespace { void ResetGrowthLeft(size_t capacity, size_t occupied_elements, CommonFields& common) { @@ -768,9 +804,7 @@ c.infoz().RecordClearedReservation(); c.infoz().RecordStorageChanged(0, policy.soo_capacity()); c.infoz().Unregister(); - (*policy.dealloc)(alloc, c.capacity(), c.control(), policy.slot_size, - policy.slot_align, c.has_infoz(), - c.blocked_element_count()); + DeallocBackingArrayImpl(c, policy, alloc); c = policy.soo_enabled ? CommonFields{soo_tag_t{}} : CommonFields{non_soo_tag_t{}}; } @@ -789,6 +823,36 @@ } } +void DestructSoo(CommonFields& c, const DtorPolicy& __restrict policy, + DeallocBackingArrayFn dealloc, void* alloc) { + ABSL_SWISSTABLE_ASSERT(!c.is_small() || !c.empty()); + if (c.is_small()) { + ABSL_SWISSTABLE_ASSERT(policy.destroy_slot != nullptr); + policy.destroy_slot(&c, c.soo_data()); + return; + } + if (policy.destroy_slot != nullptr) { + DestroySlots(c, policy.slot_size, policy.destroy_slot); + } + UnregisterAndDeallocBackingArray(c, policy, dealloc, alloc); +} + +void DestructNonSoo(CommonFields& c, const DtorPolicy& __restrict policy, + DeallocBackingArrayFn dealloc, void* alloc) { + ABSL_SWISSTABLE_ASSERT(c.capacity() > 0); + if (policy.destroy_slot != nullptr) { + if (c.is_small()) { + if (!c.empty()) { + static_assert(kMaxSmallCapacity == 1); + policy.destroy_slot(&c, c.slot_array(/*capacity=*/1)); + } + } else { + DestroySlots(c, policy.slot_size, policy.destroy_slot); + } + } + UnregisterAndDeallocBackingArray(c, policy, dealloc, alloc); +} + } // namespace void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size) { @@ -854,14 +918,6 @@ } } -void DeallocBackingArray(CommonFields& c, size_t slot_size, size_t slot_align, - DeallocBackingArrayFn dealloc, void* alloc) { - const size_t cap = c.capacity(); - c.infoz().Unregister(); - dealloc(alloc, cap, c.control(), slot_size, slot_align, c.has_infoz(), - c.blocked_element_count()); -} - template <bool kSooEnabled> void Clear(CommonFields& c, const PolicyFunctions& __restrict policy, DestroySlotFn destroy_slot, void* alloc) { @@ -899,36 +955,23 @@ c.set_reservation_size(0); } -void DestructSoo(CommonFields& c, size_t slot_size, size_t slot_align, - DestroySlotFn destroy_slot, DeallocBackingArrayFn dealloc, - void* alloc) { - ABSL_SWISSTABLE_ASSERT(!c.is_small() || !c.empty()); - if (c.is_small()) { - ABSL_SWISSTABLE_ASSERT(destroy_slot != nullptr); - destroy_slot(&c, c.soo_data()); - return; +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& __restrict policy, + DeallocBackingArrayFn dealloc, void* alloc) { + if constexpr (kSooEnabled) { + DestructSoo(c, policy, dealloc, alloc); + } else { + DestructNonSoo(c, policy, dealloc, alloc); } - if (destroy_slot != nullptr) { - DestroySlots(c, slot_size, destroy_slot); - } - DeallocBackingArray(c, slot_size, slot_align, dealloc, alloc); } - -void DestructNonSoo(CommonFields& c, size_t slot_size, size_t slot_align, - DestroySlotFn destroy_slot, DeallocBackingArrayFn dealloc, - void* alloc) { - ABSL_SWISSTABLE_ASSERT(c.capacity() > 0); - if (destroy_slot != nullptr) { - if (c.is_small()) { - if (!c.empty()) { - static_assert(kMaxSmallCapacity == 1); - destroy_slot(&c, c.slot_array(/*capacity=*/1)); - } - } else { - DestroySlots(c, slot_size, destroy_slot); - } - } - DeallocBackingArray(c, slot_size, slot_align, dealloc, alloc); +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& __restrict policy, + DeallocBackingArrayFn dealloc) { + Destruct<kSooEnabled>(c, policy, dealloc, /*alloc=*/&c); +} +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& __restrict policy) { + Destruct<kSooEnabled>(c, policy, kStandardDeallocBackingArrayFn); } namespace { @@ -1687,11 +1730,11 @@ void* new_element_target_slot = SlotAddress(new_slots, offset, slot_size); SanitizerUnpoisonMemoryRegion(new_element_target_slot, slot_size); - policy.dealloc(alloc, kOldCapacity, - // old_slots == old_ctrl in case of capacity == 1. - static_cast<ctrl_t*>(old_slots), - slot_size, slot_align, has_infoz, - /*blocked_element_count=*/0); + DeallocBackingArrayImpl(alloc, kOldCapacity, + // old_slots == old_ctrl in case of capacity == 1. + static_cast<ctrl_t*>(old_slots), slot_size, + slot_align, has_infoz, + /*blocked_element_count=*/0, policy.dealloc); PrepareInsertCommon(common); ABSL_SWISSTABLE_ASSERT(common.size() == 2); common.InitGrowthLeftNoDeleted(kNewCapacity - 2, kNewCapacity); @@ -1763,8 +1806,8 @@ SetCtrlInLargeTable(common, find_info.offset, new_h2, policy.slot_size); } ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity()); - (*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align, - has_infoz, old_blocked_element_count); + DeallocBackingArrayImpl(alloc, old_capacity, old_ctrl, slot_size, slot_align, + has_infoz, old_blocked_element_count, policy.dealloc); PrepareInsertCommon(common); ResetGrowthLeft(new_capacity, common.size(), common); @@ -2056,8 +2099,8 @@ ABSL_SWISSTABLE_ASSERT(old_capacity > 0); total_probe_length = FindNewPositionsAndTransferSlots( common, policy, old_ctrl, old_slots, old_capacity); - (*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align, - has_infoz, old_blocked_element_count); + DeallocBackingArrayImpl(alloc, old_capacity, old_ctrl, slot_size, slot_align, + has_infoz, old_blocked_element_count, policy.dealloc); ResetGrowthLeft(new_capacity, common.size(), common); if (ABSL_PREDICT_FALSE(has_infoz)) { @@ -2401,18 +2444,41 @@ static_assert(MaxSooSlotSize() == 8); #endif -template void* AllocateBackingArray<BackingArrayAlignment(alignof(size_t)), +template void* AllocateBackingArray<kStandardBackingArrayAlignment, std::allocator<char>>(void* alloc, size_t n); -template void DeallocateBackingArray<BackingArrayAlignment(alignof(size_t)), - std::allocator<char>>( - void* alloc, size_t capacity, ctrl_t* ctrl, size_t slot_size, - size_t slot_align, bool had_infoz, size_t blocked_element_count); +template void DeallocateBackingArray<kStandardBackingArrayAlignment, + std::allocator<char>>(void* alloc, + void* backing_array, + size_t n); -template void Clear<true>(CommonFields& c, const PolicyFunctions& policy, - DestroySlotFn destroy_slot, void* alloc); -template void Clear<false>(CommonFields& c, const PolicyFunctions& policy, - DestroySlotFn destroy_slot, void* alloc); +template void Clear</*kSooEnabled=*/true>(CommonFields& c, + const PolicyFunctions& policy, + DestroySlotFn destroy_slot, + void* alloc); +template void Clear</*kSooEnabled=*/false>(CommonFields& c, + const PolicyFunctions& policy, + DestroySlotFn destroy_slot, + void* alloc); + +template void Destruct</*kSooEnabled=*/true>(CommonFields& c, + const DtorPolicy& policy, + DeallocBackingArrayFn dealloc, + void* alloc); +template void Destruct</*kSooEnabled=*/true>(CommonFields& c, + const DtorPolicy& policy, + DeallocBackingArrayFn dealloc); +template void Destruct</*kSooEnabled=*/true>(CommonFields& c, + const DtorPolicy& policy); +template void Destruct</*kSooEnabled=*/false>(CommonFields& c, + const DtorPolicy& policy, + DeallocBackingArrayFn dealloc, + void* alloc); +template void Destruct</*kSooEnabled=*/false>(CommonFields& c, + const DtorPolicy& policy, + DeallocBackingArrayFn dealloc); +template void Destruct</*kSooEnabled=*/false>(CommonFields& c, + const DtorPolicy& policy); } // namespace container_internal ABSL_NAMESPACE_END
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h index d02af7e..ca0e83d 100644 --- a/absl/container/internal/raw_hash_set.h +++ b/absl/container/internal/raw_hash_set.h
@@ -322,6 +322,11 @@ std::declval<Ts>()...))>, Policy, Hash, Eq, Ts...> : std::true_type {}; +template <typename T, template <typename...> class Template> +struct is_instance_of : std::false_type {}; +template <template <typename...> class Template, typename... Args> +struct is_instance_of<Template<Args...>, Template> : std::true_type {}; + ABSL_DLL extern char kDefaultIterSlot; // Returns a pointer to a control byte that can be used by default-constructed @@ -686,7 +691,7 @@ public: static constexpr uint8_t kGrowthLeftMask = 0x7Fu; static constexpr uint8_t kDeletedBit = 0x80u; - static constexpr uint64_t kMaxGrowthLeftLowerBound = 127; + static constexpr size_t kMaxGrowthLeftLowerBound = 127; static_assert(kMaxGrowthLeftLowerBound == kGrowthLeftMask); explicit constexpr GrowthInfoLowerBound(uint8_t growth_left) @@ -1528,7 +1533,8 @@ size_t GetOverflowGrowthLeft() const { ABSL_SWISSTABLE_ASSERT(capacity() > GrowthInfoLowerBound::kMaxGrowthLeftLowerBound); - return base_internal::UnalignedLoad64(GrowthInfoOverflowAddress()); + return static_cast<size_t>( + base_internal::UnalignedLoad64(GrowthInfoOverflowAddress())); } void SetGrowthInfoOverflow(size_t overflow) { @@ -1925,6 +1931,9 @@ return std::is_same_v<CharAlloc, std::allocator<char>>; } +constexpr size_t kStandardBackingArrayAlignment = + BackingArrayAlignment(alignof(size_t)); + // Allocates `n` bytes for a backing array. template <size_t AlignOfBackingArray, typename Alloc> void* AllocateBackingArray(void* alloc, size_t n) { @@ -1932,20 +1941,16 @@ } template <size_t AlignOfBackingArray, typename Alloc> -void DeallocateBackingArray(void* alloc, size_t capacity, ctrl_t* ctrl, - size_t slot_size, size_t slot_align, bool had_infoz, - size_t blocked_element_count) { - RawHashSetLayout layout(capacity, slot_size, slot_align, had_infoz, - blocked_element_count); - void* backing_array = ctrl - layout.control_offset(); - // Unpoison before returning the memory to the allocator. - SanitizerUnpoisonMemoryRegion(backing_array, layout.alloc_size()); - Deallocate<AlignOfBackingArray>(static_cast<Alloc*>(alloc), backing_array, - layout.alloc_size()); +void DeallocateBackingArray(void* alloc, void* backing_array, size_t n) { + Deallocate<AlignOfBackingArray>(static_cast<Alloc*>(alloc), backing_array, n); } using DeallocBackingArrayFn = - decltype(&DeallocateBackingArray<8, std::allocator<char>>); + decltype(&DeallocateBackingArray<kStandardBackingArrayAlignment, + std::allocator<char>>); +inline constexpr DeallocBackingArrayFn kStandardDeallocBackingArrayFn = + &DeallocateBackingArray<kStandardBackingArrayAlignment, + std::allocator<char>>; // PolicyFunctions bundles together some information for a particular // raw_hash_set<T, ...> instantiation. This information is passed to @@ -1999,6 +2004,49 @@ } }; +using DestroySlotFn = void (*)(void* set, void* slot); + +// DtorPolicy bundles information for a particular +// raw_hash_set<T, ...> instantiation that is needed to destroy the set. +// This is a subset of the fields in PolicyFunctions to avoid bloat of linker +// input size. Destructor is being instantiated way more often than other +// functions, so we do not want to include non-destructor related fields. +struct DtorPolicy { + uint32_t slot_size; + uint16_t slot_align; + DestroySlotFn destroy_slot; + + template <uint32_t kSlotSize, uint16_t kSlotAlign> + static const DtorPolicy& GetTrivialDestructRef() { + return R<kSlotSize, kSlotAlign>(); + } + + template <typename SetType> + static const DtorPolicy& GetRef() { + return R<SetType>(); + } + + private: + // Code below is aimed to optimize linker input size. Destructors are being + // instantiated way more often than other functions, so we make a small effort + // to minimize the name length of static variables. + template <uint32_t kSlotSize, uint16_t kSlotAlign> + static const DtorPolicy& R() { + static constexpr DtorPolicy p = {kSlotSize, kSlotAlign, + /*destroy_slot=*/nullptr}; + return p; + } + template <typename SetType> + static const DtorPolicy& R() { + static constexpr DtorPolicy p = { + sizeof(typename SetType::slot_type), + alignof(typename SetType::slot_type), + SetType::get_destroy_slot_fn(), + }; + return p; + } +}; + // The following functions are used for calculating the max valid size of the // table. This is important for security to avoid overflowing size_t when // calculating the allocation size of the backing array @@ -2132,8 +2180,6 @@ void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy, void* alloc, bool reuse); -using DestroySlotFn = void (*)(void* set, void* slot); - // Destroys all full slots in the backing array. // REQUIRES: !is_small(c.capacity()). // REQUIRES: destroy_slot != nullptr. @@ -2142,31 +2188,31 @@ // Deallocates the backing array and unregister infoz if necessary. // REQUIRES: c.capacity > raw_hash_set::DefaultCapacity(). -void DeallocBackingArray(CommonFields& c, size_t slot_size, size_t slot_align, - DeallocBackingArrayFn dealloc, void* alloc); +void UnregisterAndDeallocBackingArray(CommonFields& c, const DtorPolicy& policy, + DeallocBackingArrayFn dealloc, + void* alloc); // Type erased version of raw_hash_set::clear. template <bool kSooEnabled> void Clear(CommonFields& c, const PolicyFunctions& policy, DestroySlotFn destroy_slot, void* alloc); -// NOTE: Destruct* functions couldn't use PolicyFunctions in order to support -// incomplete types. -// TODO(b/515666499): try to use PolicyFunctions since it makes code simpler and -// binary size smaller. - -// Destructs all elements and deallocates the backing array for SOO tables. +// Destructs all elements and deallocates the backing array tables. +// For kSooEnabled = true: // REQUIRES: !c.is_small || !c.empty() -// REQUIRES: !c.is_small || destroy_slot != nullptr -void DestructSoo(CommonFields& c, size_t slot_size, size_t slot_align, - DestroySlotFn destroy_slot, DeallocBackingArrayFn dealloc, - void* alloc); - -// Destructs all elements and deallocates the backing array for non-SOO tables. +// REQUIRES: !c.is_small || policy.destroy_slot != nullptr +// For kSooEnabled = false: // REQUIRES: c.capacity > 0. -void DestructNonSoo(CommonFields& c, size_t slot_size, size_t slot_align, - DestroySlotFn destroy_slot, DeallocBackingArrayFn dealloc, - void* alloc); +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& policy, + DeallocBackingArrayFn dealloc, void* alloc); +// REQUIRES: std::is_empty_v<Alloc> +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& policy, + DeallocBackingArrayFn dealloc); +// REQUIRES: std::is_empty_v<Alloc> && dealloc == kStandardDeallocBackingArrayFn +template <bool kSooEnabled> +void Destruct(CommonFields& c, const DtorPolicy& policy); // Type-erased versions of raw_hash_set::erase_meta_only_{small,large}. void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size); @@ -2301,9 +2347,13 @@ using slot_type = typename PolicyTraits::slot_type; - constexpr static bool kIsDefaultHash = + constexpr static bool kIsAbslHash = std::is_same_v<hasher, absl::Hash<key_type>> || - std::is_same_v<hasher, absl::container_internal::StringHash>; + std::is_same_v<hasher, absl::container_internal::StringHash> || + // TODO(b/384509507): resolve `no header providing + // "absl::hash_internal::TransparentHash" is directly included`. + // Maybe we should make "internal/hash.h" be a separate library. + is_instance_of<hasher, absl::hash_internal::TransparentHash>::value; // For non-default hashers it is required to have low bits entropy because // (a) in such cases, the seed is xor'ed with the hash value rather than being // used as a seed for the hash function, (b) the seed has low bits that are @@ -2312,7 +2362,7 @@ // performance optimization for default hashers. For non-default hashers, we // shift it back. constexpr static size_t kSeedShift = - kIsDefaultHash ? 0 : HashtableInlineData::kCapacityBitStoredInDataCount; + kIsAbslHash ? 0 : HashtableInlineData::kCapacityBitStoredInDataCount; constexpr static bool SooEnabled() { return PolicyTraits::soo_enabled() && @@ -3356,6 +3406,7 @@ HashtableDebugAccess; friend struct absl::container_internal::HashtableFreeFunctionsAccess; + friend DtorPolicy; struct FindElement { template <class K, class... Args> @@ -3481,30 +3532,33 @@ DestroySlots(common(), sizeof(slot_type), get_destroy_slot_fn()); } - void dealloc() { - ABSL_SWISSTABLE_ASSERT(capacity() > DefaultCapacity()); - DeallocBackingArray(common(), sizeof(slot_type), alignof(slot_type), - get_dealloc_backing_array_fn(), &char_alloc_ref()); - } - void destructor_impl() { if (SwisstableGenerationsEnabled() && maybe_invalid_capacity().IsMovedFrom()) { return; } + constexpr bool kIsStandardBackingArrayAlignment = + std::is_same_v<CharAlloc, std::allocator<char>> && + BackingArrayAlignment(alignof(slot_type)) == + kStandardBackingArrayAlignment; if constexpr (SooEnabled()) { if (is_small() && (PolicyTraits::template destroy_is_trivial<Alloc>() || empty())) { return; } - DestructSoo(common(), sizeof(slot_type), alignof(slot_type), - get_destroy_slot_fn(), get_dealloc_backing_array_fn(), - &char_alloc_ref()); } else { if (capacity() == 0) return; - DestructNonSoo(common(), sizeof(slot_type), alignof(slot_type), - get_destroy_slot_fn(), get_dealloc_backing_array_fn(), - &char_alloc_ref()); + } + if constexpr (std::is_empty_v<Alloc>) { + if constexpr (kIsStandardBackingArrayAlignment) { + Destruct<SooEnabled()>(common(), GetDtorPolicy()); + } else { + Destruct<SooEnabled()>(common(), GetDtorPolicy(), + get_dealloc_backing_array_fn()); + } + } else { + Destruct<SooEnabled()>(common(), GetDtorPolicy(), + get_dealloc_backing_array_fn(), &char_alloc_ref()); } } @@ -3538,13 +3592,13 @@ } template <class K> ABSL_ATTRIBUTE_ALWAYS_INLINE size_t hash_of(const K& key) const { - return HashElement<hasher, kIsDefaultHash, kSeedShift>{ + return HashElement<hasher, kIsAbslHash, kSeedShift>{ hash_ref(), common().seed().seed()}(key); } ABSL_ATTRIBUTE_ALWAYS_INLINE size_t hash_of(slot_type* slot) const { return PolicyTraits::apply( - HashElement<hasher, kIsDefaultHash, kSeedShift>{hash_ref(), - common().seed().seed()}, + HashElement<hasher, kIsAbslHash, kSeedShift>{hash_ref(), + common().seed().seed()}, PolicyTraits::element(slot)); } @@ -3633,7 +3687,11 @@ insert(std::move(PolicyTraits::element(it.slot()))); that.destroy(it.slot()); } - if (!that.is_soo()) that.dealloc(); + if (!that.is_soo()) { + UnregisterAndDeallocBackingArray(that.common(), that.GetDtorPolicy(), + that.get_dealloc_backing_array_fn(), + &that.char_alloc_ref()); + } that.common() = CommonFields::CreateDefault<SooEnabled()>(); annotate_for_bug_detection_on_move(that); return *this; @@ -3685,7 +3743,7 @@ : 0, kUseMemcpy>( common(), GetPolicyFunctions(), - HashKey<hasher, K, kIsDefaultHash, kSeedShift>{hash_ref(), key}, + HashKey<hasher, K, kIsAbslHash, kSeedShift>{hash_ref(), key}, force_sampling)); return {slot, true}; } @@ -3702,11 +3760,10 @@ return {single_slot(), false}; } } - return { - to_slot(PrepareInsertSmallNonSoo( - common(), GetPolicyFunctions(), - HashKey<hasher, K, kIsDefaultHash, kSeedShift>{hash_ref(), key})), - true}; + return {to_slot(PrepareInsertSmallNonSoo( + common(), GetPolicyFunctions(), + HashKey<hasher, K, kIsAbslHash, kSeedShift>{hash_ref(), key})), + true}; } template <class K> @@ -3738,7 +3795,7 @@ ? PrepareInsertLargeGenerationsEnabled( common(), GetPolicyFunctions(), hash, mask_empty, FindInfo{target_group_offset, seq.index()}, - HashKey<hasher, K, kIsDefaultHash, kSeedShift>{ + HashKey<hasher, K, kIsAbslHash, kSeedShift>{ hash_ref(), key}) : PrepareInsertLarge( common(), GetPolicyFunctions(), hash, mask_empty, @@ -4019,6 +4076,21 @@ CharAlloc>; } + static const DtorPolicy& GetDtorPolicy() { + static_assert(sizeof(slot_type) <= (std::numeric_limits<uint32_t>::max)(), + "Slot size is too large. Use std::unique_ptr for value type " + "or use absl::node_hash_{map,set}."); + static_assert(alignof(slot_type) <= + size_t{(std::numeric_limits<uint16_t>::max)()}); + if constexpr (PolicyTraits::template destroy_is_trivial<Alloc>()) { + return DtorPolicy::GetTrivialDestructRef< + static_cast<uint32_t>(sizeof(slot_type)), + static_cast<uint16_t>(alignof(slot_type))>(); + } else { + return DtorPolicy::GetRef<raw_hash_set>(); + } + } + static const PolicyFunctions& GetPolicyFunctions() { static_assert(sizeof(slot_type) <= (std::numeric_limits<uint32_t>::max)(), "Slot size is too large. Use std::unique_ptr for value type " @@ -4041,7 +4113,7 @@ // for standard layout and alignof(Hash) <= alignof(CommonFields). std::is_empty_v<hasher> ? &GetRefForEmptyClass : &raw_hash_set::get_hash_ref_fn, - PolicyTraits::template get_hash_slot_fn<hasher, kIsDefaultHash, + PolicyTraits::template get_hash_slot_fn<hasher, kIsAbslHash, kSeedShift>(), PolicyTraits::transfer_uses_memcpy() ? TransferNRelocatable<sizeof(slot_type)> @@ -4055,8 +4127,8 @@ } // Bundle together CommonFields plus other objects which might be empty. - // CompressedTuple will ensure that sizeof is not affected by any of the empty - // fields that occur after CommonFields. + // CompressedTuple will ensure that sizeof is not affected by any of the + // empty fields that occur after CommonFields. absl::container_internal::CompressedTuple<CommonFields, hasher, key_equal, CharAlloc> settings_{CommonFields::CreateDefault<SooEnabled()>(), hasher{}, @@ -4147,7 +4219,7 @@ using Traits = typename Set::PolicyTraits; using Slot = typename Traits::slot_type; - constexpr static bool kIsDefaultHash = Set::kIsDefaultHash; + constexpr static bool kIsAbslHash = Set::kIsAbslHash; static size_t GetNumProbes(const Set& set, const typename Set::key_type& key) { @@ -4207,19 +4279,36 @@ bool); #endif -extern template void* AllocateBackingArray< - BackingArrayAlignment(alignof(size_t)), std::allocator<char>>(void* alloc, - size_t n); -extern template void DeallocateBackingArray< - BackingArrayAlignment(alignof(size_t)), std::allocator<char>>( - void* alloc, size_t capacity, ctrl_t* ctrl, size_t slot_size, - size_t slot_align, bool had_infoz, size_t blocked_element_count); +extern template void* AllocateBackingArray<kStandardBackingArrayAlignment, + std::allocator<char>>(void* alloc, + size_t n); +extern template void +DeallocateBackingArray<kStandardBackingArrayAlignment, std::allocator<char>>( + void* alloc, void* backing_array, size_t n); -extern template void Clear<true>(CommonFields& c, const PolicyFunctions& policy, - DestroySlotFn destroy_slot, void* alloc); -extern template void Clear<false>(CommonFields& c, - const PolicyFunctions& policy, - DestroySlotFn destroy_slot, void* alloc); +extern template void Clear</*kSooEnabled=*/true>(CommonFields& c, + const PolicyFunctions& policy, + DestroySlotFn destroy_slot, + void* alloc); +extern template void Clear</*kSooEnabled=*/false>(CommonFields& c, + const PolicyFunctions& policy, + DestroySlotFn destroy_slot, + void* alloc); + +extern template void Destruct</*kSooEnabled=*/true>( + CommonFields& c, const DtorPolicy& policy, DeallocBackingArrayFn dealloc, + void* alloc); +extern template void Destruct</*kSooEnabled=*/true>( + CommonFields& c, const DtorPolicy& policy, DeallocBackingArrayFn dealloc); +extern template void Destruct</*kSooEnabled=*/true>(CommonFields& c, + const DtorPolicy& policy); +extern template void Destruct</*kSooEnabled=*/false>( + CommonFields& c, const DtorPolicy& policy, DeallocBackingArrayFn dealloc, + void* alloc); +extern template void Destruct</*kSooEnabled=*/false>( + CommonFields& c, const DtorPolicy& policy, DeallocBackingArrayFn dealloc); +extern template void Destruct</*kSooEnabled=*/false>(CommonFields& c, + const DtorPolicy& policy); } // namespace container_internal ABSL_NAMESPACE_END
diff --git a/absl/container/internal/raw_hash_set_benchmark.cc b/absl/container/internal/raw_hash_set_benchmark.cc index 58baabe..fccdb48 100644 --- a/absl/container/internal/raw_hash_set_benchmark.cc +++ b/absl/container/internal/raw_hash_set_benchmark.cc
@@ -29,6 +29,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/container/internal/container_memory.h" #include "absl/container/internal/hash_function_defaults.h" @@ -75,6 +76,38 @@ return std::forward<F>(f)(x, x); } + template <class Hash, bool kIsAbsl, size_t kSeedShift> + static constexpr HashSlotFn get_hash_slot_fn() { + return nullptr; + } +}; + +struct IntArrayPolicy { + using slot_type = std::array<int64_t, 3>; + using key_type = std::array<int64_t, 3>; + using init_type = std::array<int64_t, 3>; + + using DefaultHash = void; + using DefaultEq = void; + using DefaultAlloc = void; + + static void construct(void*, slot_type* slot, const init_type& v) { + *slot = v; + } + static std::true_type destroy(void*, slot_type*) { return std::true_type{}; } + static std::true_type transfer(void*, slot_type* new_slot, + slot_type* old_slot) { + *new_slot = *old_slot; + return std::true_type{}; + } + + static slot_type& element(slot_type* slot) { return *slot; } + + template <class F> + static auto apply(F&& f, slot_type x) -> decltype(std::forward<F>(f)(x, x)) { + return std::forward<F>(f)(x, x); + } + template <class Hash, bool kIsDefault, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; @@ -142,7 +175,7 @@ PairArgs(std::forward<Args>(args)...)); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -158,7 +191,18 @@ struct StringTable : raw_hash_set<StringPolicy, StringHash, StringEq, std::allocator<int>> { using Base = typename StringTable::raw_hash_set; - StringTable() {} + StringTable() = default; + using Base::Base; +}; + +struct IntArrayTable + : raw_hash_set< + IntArrayPolicy, + container_internal::hash_default_hash<std::array<int64_t, 3>>, + std::equal_to<std::array<int64_t, 3>>, + std::allocator<std::array<int64_t, 3>>> { + using Base = typename IntArrayTable::raw_hash_set; + IntArrayTable() = default; using Base::Base; }; @@ -166,19 +210,20 @@ : raw_hash_set<IntPolicy, container_internal::hash_default_hash<int64_t>, std::equal_to<int64_t>, std::allocator<int64_t>> { using Base = typename IntTable::raw_hash_set; - IntTable() {} + IntTable() = default; using Base::Base; }; struct MyInt { int64_t value; + + template <typename H> + friend H AbslHashValue(H h, const MyInt& x) { + return H::combine(std::move(h), x.value); + } }; -struct TransparentIntHash { - using is_transparent = void; - size_t operator()(int64_t x) const { return absl::Hash<int64_t>{}(x); } - size_t operator()(MyInt x) const { return absl::Hash<int64_t>{}(x.value); } -}; +using TransparentIntHash = absl::TransparentHash<int64_t, MyInt>; struct TransparentIntEq { using is_transparent = void; @@ -487,6 +532,27 @@ ->Arg(256) ->Arg(512); +// value_type is trivially destructible, so the benchmark isn't measuring +// ~value_type() time. +void BM_DestructNonSooTableOneElement(benchmark::State& state) { + constexpr size_t kBatchSize = 1024; + constexpr size_t kReserveSize = 1; + + std::vector<IntArrayTable> tables; + while (state.KeepRunningBatch(kBatchSize)) { + benchmark::DoNotOptimize(tables); + state.PauseTiming(); + tables.resize(kBatchSize); + for (auto& t : tables) { + t.reserve(kReserveSize); + } + state.ResumeTiming(); + benchmark::DoNotOptimize(tables); + tables.clear(); + } +} +BENCHMARK(BM_DestructNonSooTableOneElement); + void BM_ReserveStringTable(benchmark::State& state) { constexpr size_t kBatchSize = 1024; size_t reserve_size = static_cast<size_t>(state.range(0));
diff --git a/absl/container/internal/raw_hash_set_probe_benchmark.cc b/absl/container/internal/raw_hash_set_probe_benchmark.cc index fee9531..890e40e 100644 --- a/absl/container/internal/raw_hash_set_probe_benchmark.cc +++ b/absl/container/internal/raw_hash_set_probe_benchmark.cc
@@ -81,7 +81,7 @@ return std::forward<F>(f)(arg, arg); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr auto get_hash_slot_fn() { return nullptr; }
diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc index 06a73bf..cc252b4 100644 --- a/absl/container/internal/raw_hash_set_test.cc +++ b/absl/container/internal/raw_hash_set_test.cc
@@ -1022,7 +1022,7 @@ std::forward<F>(f), std::forward<Args>(args)...); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -1176,7 +1176,7 @@ PairArgs(std::forward<Args>(args)...)); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -2808,6 +2808,11 @@ return *this; } + template <typename H> + friend H AbslHashValue(H h, const DecomposeType& d) { + return H::combine(std::move(h), d.i); + } + int i; }; @@ -2850,7 +2855,7 @@ return std::forward<F>(f)(x, x); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return nullptr; } @@ -3000,6 +3005,8 @@ TestDecompose<TransparentHashIntOverload, DecomposeEq>(true); TestDecompose<TransparentHashIntOverload, TransparentEqIntOverload>(true); TestDecompose<DecomposeHash, TransparentEqIntOverload>(true); + TestDecompose<absl::TransparentHash<DecomposeType, int>, + TransparentEqIntOverload>(true); } struct Modulo1000Hash {
diff --git a/absl/container/internal/test_instance_tracker.cc b/absl/container/internal/test_instance_tracker.cc index f9947f0..03ec410 100644 --- a/absl/container/internal/test_instance_tracker.cc +++ b/absl/container/internal/test_instance_tracker.cc
@@ -14,6 +14,8 @@ #include "absl/container/internal/test_instance_tracker.h" +#include "absl/base/config.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace test_internal {
diff --git a/absl/container/internal/test_instance_tracker.h b/absl/container/internal/test_instance_tracker.h index ab1e3bc..52aa392 100644 --- a/absl/container/internal/test_instance_tracker.h +++ b/absl/container/internal/test_instance_tracker.h
@@ -19,6 +19,7 @@ #include <ostream> #include <utility> +#include "absl/base/config.h" #include "absl/types/compare.h" namespace absl {
diff --git a/absl/container/internal/unordered_map_lookup_test.h b/absl/container/internal/unordered_map_lookup_test.h index 6405ae4..7015e5d 100644 --- a/absl/container/internal/unordered_map_lookup_test.h +++ b/absl/container/internal/unordered_map_lookup_test.h
@@ -19,6 +19,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_generator_testing.h" #include "absl/container/internal/hash_policy_testing.h"
diff --git a/absl/container/internal/unordered_map_members_test.h b/absl/container/internal/unordered_map_members_test.h index 6d7ebca..76b1449 100644 --- a/absl/container/internal/unordered_map_members_test.h +++ b/absl/container/internal/unordered_map_members_test.h
@@ -22,6 +22,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/meta/type_traits.h" namespace absl {
diff --git a/absl/container/internal/unordered_map_modifiers_test.h b/absl/container/internal/unordered_map_modifiers_test.h index 38605d8..aaaae3f 100644 --- a/absl/container/internal/unordered_map_modifiers_test.h +++ b/absl/container/internal/unordered_map_modifiers_test.h
@@ -22,6 +22,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_generator_testing.h" #include "absl/container/internal/hash_policy_testing.h"
diff --git a/absl/container/internal/unordered_map_test.cc b/absl/container/internal/unordered_map_test.cc index badd6b2..64685db 100644 --- a/absl/container/internal/unordered_map_test.cc +++ b/absl/container/internal/unordered_map_test.cc
@@ -18,6 +18,7 @@ #include <utility> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_policy_testing.h" #include "absl/container/internal/unordered_map_constructor_test.h" #include "absl/container/internal/unordered_map_lookup_test.h"
diff --git a/absl/container/internal/unordered_set_lookup_test.h b/absl/container/internal/unordered_set_lookup_test.h index 4edb962..9b50cf8 100644 --- a/absl/container/internal/unordered_set_lookup_test.h +++ b/absl/container/internal/unordered_set_lookup_test.h
@@ -20,6 +20,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_generator_testing.h" #include "absl/container/internal/hash_policy_testing.h"
diff --git a/absl/container/internal/unordered_set_members_test.h b/absl/container/internal/unordered_set_members_test.h index 6cc173b..34d9e69 100644 --- a/absl/container/internal/unordered_set_members_test.h +++ b/absl/container/internal/unordered_set_members_test.h
@@ -21,6 +21,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/meta/type_traits.h" namespace absl {
diff --git a/absl/container/internal/unordered_set_modifiers_test.h b/absl/container/internal/unordered_set_modifiers_test.h index e7ed774..e9b3a77 100644 --- a/absl/container/internal/unordered_set_modifiers_test.h +++ b/absl/container/internal/unordered_set_modifiers_test.h
@@ -21,6 +21,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_generator_testing.h" #include "absl/container/internal/hash_policy_testing.h"
diff --git a/absl/container/internal/unordered_set_test.cc b/absl/container/internal/unordered_set_test.cc index d03403b..ef99624 100644 --- a/absl/container/internal/unordered_set_test.cc +++ b/absl/container/internal/unordered_set_test.cc
@@ -16,6 +16,7 @@ #include <unordered_set> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/internal/hash_policy_testing.h" #include "absl/container/internal/unordered_set_constructor_test.h" #include "absl/container/internal/unordered_set_lookup_test.h"
diff --git a/absl/container/linked_hash_map_test.cc b/absl/container/linked_hash_map_test.cc index 8b95c12..a905e92 100644 --- a/absl/container/linked_hash_map_test.cc +++ b/absl/container/linked_hash_map_test.cc
@@ -19,6 +19,7 @@ #include <cstdint> #include <functional> #include <memory> +#include <stdexcept> #include <string> #include <tuple> #include <type_traits>
diff --git a/absl/container/node_hash_map.h b/absl/container/node_hash_map.h index 75fc0cc..4a65ef5 100644 --- a/absl/container/node_hash_map.h +++ b/absl/container/node_hash_map.h
@@ -45,6 +45,7 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/container/hash_container_defaults.h" #include "absl/container/internal/container_memory.h" #include "absl/container/internal/node_slot_policy.h" @@ -681,11 +682,11 @@ static Value& value(value_type* elem) { return elem->second; } static const Value& value(const value_type* elem) { return elem->second; } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { return memory_internal::IsLayoutCompatible<Key, Value>::value ? &TypeErasedDerefAndApplyToSlotFirstFn<Hash, value_type, - kIsDefault, kSeedShift> + kIsAbsl, kSeedShift> : nullptr; } };
diff --git a/absl/container/node_hash_set.h b/absl/container/node_hash_set.h index 9da52e7..7265029 100644 --- a/absl/container/node_hash_set.h +++ b/absl/container/node_hash_set.h
@@ -43,6 +43,7 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/container/hash_container_defaults.h" #include "absl/container/internal/container_memory.h" #include "absl/container/internal/node_slot_policy.h" @@ -582,9 +583,9 @@ static size_t element_space_used(const T*) { return sizeof(T); } - template <class Hash, bool kIsDefault, size_t kSeedShift> + template <class Hash, bool kIsAbsl, size_t kSeedShift> static constexpr HashSlotFn get_hash_slot_fn() { - return &TypeErasedDerefAndApplyToSlotFn<Hash, T, kIsDefault, kSeedShift>; + return &TypeErasedDerefAndApplyToSlotFn<Hash, T, kIsAbsl, kSeedShift>; } }; } // namespace container_internal
diff --git a/absl/container/sample_element_size_test.cc b/absl/container/sample_element_size_test.cc index 2993f2a..0507aa1 100644 --- a/absl/container/sample_element_size_test.cc +++ b/absl/container/sample_element_size_test.cc
@@ -20,6 +20,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "absl/container/internal/hashtablez_sampler.h"
diff --git a/absl/crc/crc32c.cc b/absl/crc/crc32c.cc index 9020563..ed826e2 100644 --- a/absl/crc/crc32c.cc +++ b/absl/crc/crc32c.cc
@@ -17,6 +17,7 @@ #include <cstddef> #include <cstdint> +#include "absl/base/config.h" #include "absl/crc/internal/crc.h" #include "absl/crc/internal/crc32c.h" #include "absl/crc/internal/crc_memcpy.h"
diff --git a/absl/crc/crc32c.h b/absl/crc/crc32c.h index 4ce941d..edeacd0 100644 --- a/absl/crc/crc32c.h +++ b/absl/crc/crc32c.h
@@ -29,6 +29,7 @@ #include <cstdint> #include <ostream> +#include "absl/base/config.h" #include "absl/crc/internal/crc32c_inline.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h"
diff --git a/absl/crc/internal/crc.cc b/absl/crc/internal/crc.cc index ec6a031..d135e3c 100644 --- a/absl/crc/internal/crc.cc +++ b/absl/crc/internal/crc.cc
@@ -45,6 +45,7 @@ #include <cstdint> #include <iterator> +#include "absl/base/config.h" #include "absl/base/internal/endian.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/prefetch.h"
diff --git a/absl/crc/internal/crc_internal.h b/absl/crc/internal/crc_internal.h index ac9c38d..f4d128a 100644 --- a/absl/crc/internal/crc_internal.h +++ b/absl/crc/internal/crc_internal.h
@@ -20,6 +20,7 @@ #include <memory> #include <vector> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/optimization.h" #include "absl/crc/internal/crc.h"
diff --git a/absl/debugging/BUILD.bazel b/absl/debugging/BUILD.bazel index 6230d39..b36967a 100644 --- a/absl/debugging/BUILD.bazel +++ b/absl/debugging/BUILD.bazel
@@ -448,6 +448,7 @@ tags = ["notsan"], deps = [ ":stack_consumption", + "//absl/base:config", "//absl/base:core_headers", "//absl/log", "@googletest//:gtest",
diff --git a/absl/debugging/internal/address_is_readable.cc b/absl/debugging/internal/address_is_readable.cc index e9be2ca..88aa516 100644 --- a/absl/debugging/internal/address_is_readable.cc +++ b/absl/debugging/internal/address_is_readable.cc
@@ -19,6 +19,8 @@ #include <cerrno> +#include "absl/base/config.h" + #if !defined(__linux__) || defined(__ANDROID__) namespace absl {
diff --git a/absl/debugging/internal/stack_consumption.cc b/absl/debugging/internal/stack_consumption.cc index b54a1b2..a46adf1 100644 --- a/absl/debugging/internal/stack_consumption.cc +++ b/absl/debugging/internal/stack_consumption.cc
@@ -15,6 +15,8 @@ #include "absl/debugging/internal/stack_consumption.h" +#include "absl/base/config.h" + #ifdef ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION #include <signal.h>
diff --git a/absl/debugging/internal/stack_consumption_test.cc b/absl/debugging/internal/stack_consumption_test.cc index 0255ac8..ee93f01 100644 --- a/absl/debugging/internal/stack_consumption_test.cc +++ b/absl/debugging/internal/stack_consumption_test.cc
@@ -15,6 +15,8 @@ #include "absl/debugging/internal/stack_consumption.h" +#include "absl/base/config.h" + #ifdef ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION #include <string.h>
diff --git a/absl/debugging/internal/stacktrace_powerpc-inl.inc b/absl/debugging/internal/stacktrace_powerpc-inl.inc index f23c29c..a20a715 100644 --- a/absl/debugging/internal/stacktrace_powerpc-inl.inc +++ b/absl/debugging/internal/stacktrace_powerpc-inl.inc
@@ -51,11 +51,10 @@ return (sp + 2); #elif defined(_CALL_SYSV) return (sp + 1); -#elif defined(__APPLE__) || defined(__FreeBSD__) || \ - (defined(__linux__) && defined(__PPC64__)) +#elif defined(__APPLE__) || defined(__PPC64__) // This check is in case the compiler doesn't define _CALL_AIX/etc. return (sp + 2); -#elif defined(__linux) +#elif defined(__linux__) || defined(__FreeBSD__) // This check is in case the compiler doesn't define _CALL_SYSV. return (sp + 1); #else
diff --git a/absl/debugging/internal/vdso_support.cc b/absl/debugging/internal/vdso_support.cc index 9d96f3b..48d4f50 100644 --- a/absl/debugging/internal/vdso_support.cc +++ b/absl/debugging/internal/vdso_support.cc
@@ -21,6 +21,7 @@ #include <atomic> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/debugging/internal/elf_mem_image.h" #ifdef ABSL_HAVE_VDSO_SUPPORT // defined in vdso_support.h
diff --git a/absl/debugging/internal/vdso_support.h b/absl/debugging/internal/vdso_support.h index 6562c6c..8661261 100644 --- a/absl/debugging/internal/vdso_support.h +++ b/absl/debugging/internal/vdso_support.h
@@ -42,6 +42,7 @@ #include <atomic> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/debugging/internal/elf_mem_image.h" #ifdef ABSL_HAVE_ELF_MEM_IMAGE
diff --git a/absl/debugging/symbolize.h b/absl/debugging/symbolize.h index 43d93a8..07133e0 100644 --- a/absl/debugging/symbolize.h +++ b/absl/debugging/symbolize.h
@@ -52,6 +52,7 @@ #ifndef ABSL_DEBUGGING_SYMBOLIZE_H_ #define ABSL_DEBUGGING_SYMBOLIZE_H_ +#include "absl/base/config.h" #include "absl/debugging/internal/symbolize.h" namespace absl {
diff --git a/absl/debugging/symbolize_elf.inc b/absl/debugging/symbolize_elf.inc index 06c5634..182d0fd 100644 --- a/absl/debugging/symbolize_elf.inc +++ b/absl/debugging/symbolize_elf.inc
@@ -1104,8 +1104,8 @@ LineReader reader(wrapped_maps_fd.get(), static_cast<char *>(tmp_buf), tmp_buf_size); while (true) { - const char *cursor; - const char *eol; + const char *cursor = nullptr; + const char *eol = nullptr; if (!reader.ReadLine(&cursor, &eol)) { // EOF or malformed line. break; }
diff --git a/absl/flags/config_test.cc b/absl/flags/config_test.cc index 5c74d76..00e9b66 100644 --- a/absl/flags/config_test.cc +++ b/absl/flags/config_test.cc
@@ -13,6 +13,7 @@ // limitations under the License. #include "absl/flags/config.h" + #include "gtest/gtest.h" #ifdef __APPLE__
diff --git a/absl/flags/internal/commandlineflag.cc b/absl/flags/internal/commandlineflag.cc index 3c114d1..4ba8a8e 100644 --- a/absl/flags/internal/commandlineflag.cc +++ b/absl/flags/internal/commandlineflag.cc
@@ -15,6 +15,8 @@ #include "absl/flags/internal/commandlineflag.h" +#include "absl/base/config.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace flags_internal {
diff --git a/absl/flags/internal/flag.h b/absl/flags/internal/flag.h index 7855a10..8ef95ab 100644 --- a/absl/flags/internal/flag.h +++ b/absl/flags/internal/flag.h
@@ -25,6 +25,7 @@ #include <string> #include <type_traits> #include <typeinfo> +#include <utility> #include "absl/base/attributes.h" #include "absl/base/call_once.h" @@ -43,7 +44,7 @@ #include "absl/synchronization/mutex.h" #include "absl/utility/utility.h" -namespace absl { + namespace absl { ABSL_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////////// @@ -605,8 +606,8 @@ } template <typename T, std::enable_if_t<flags_internal::StorageKind<T>() == - FlagValueStorageKind::kOneWordAtomic, - int> = 0> + FlagValueStorageKind::kOneWordAtomic, + int> = 0> void Read(T* value) const ABSL_LOCKS_EXCLUDED(DataGuard()) { int64_t v = ReadOneWord(); std::memcpy(value, static_cast<const void*>(&v), sizeof(T));
diff --git a/absl/flags/internal/sequence_lock.h b/absl/flags/internal/sequence_lock.h index 36318ab..da04ff4 100644 --- a/absl/flags/internal/sequence_lock.h +++ b/absl/flags/internal/sequence_lock.h
@@ -23,6 +23,7 @@ #include <cassert> #include <cstring> +#include "absl/base/config.h" #include "absl/base/optimization.h" namespace absl {
diff --git a/absl/functional/BUILD.bazel b/absl/functional/BUILD.bazel index c41b211..d1b46c7 100644 --- a/absl/functional/BUILD.bazel +++ b/absl/functional/BUILD.bazel
@@ -110,6 +110,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, visibility = ["//visibility:public"], deps = [ + "//absl/base:config", "//absl/container:compressed_tuple", "//absl/meta:type_traits", "//absl/utility", @@ -201,6 +202,7 @@ deps = [ ":any_invocable", ":function_ref", + "//absl/base:config", "//absl/base:core_headers", "@google_benchmark//:benchmark_main", ],
diff --git a/absl/functional/any_invocable_test.h b/absl/functional/any_invocable_test.h index d667fa4..6d09c12 100644 --- a/absl/functional/any_invocable_test.h +++ b/absl/functional/any_invocable_test.h
@@ -24,8 +24,6 @@ #ifndef ABSL_FUNCTIONAL_ANY_INVOCABLE_TEST_H_ #define ABSL_FUNCTIONAL_ANY_INVOCABLE_TEST_H_ -#include "absl/functional/any_invocable.h" - #include <cstddef> #include <cstdlib> #include <functional> @@ -34,10 +32,12 @@ #include <memory> #include <numeric> #include <type_traits> +#include <utility> #include "gtest/gtest.h" #include "absl/base/config.h" #include "absl/base/nullability.h" +#include "absl/functional/any_invocable.h" #include "absl/meta/type_traits.h" #include "absl/utility/utility.h"
diff --git a/absl/functional/any_invocable_test_inst1.cc b/absl/functional/any_invocable_test_inst1.cc index 68a5955..2bc95d4 100644 --- a/absl/functional/any_invocable_test_inst1.cc +++ b/absl/functional/any_invocable_test_inst1.cc
@@ -18,6 +18,7 @@ // SKIP_ABSL_INLINE_NAMESPACE_CHECK +#include "gtest/gtest.h" #include "absl/functional/any_invocable_test.h" namespace absl_any_invocable_test {
diff --git a/absl/functional/any_invocable_test_inst2.cc b/absl/functional/any_invocable_test_inst2.cc index 5b5f22a..6e01402 100644 --- a/absl/functional/any_invocable_test_inst2.cc +++ b/absl/functional/any_invocable_test_inst2.cc
@@ -18,6 +18,7 @@ // SKIP_ABSL_INLINE_NAMESPACE_CHECK +#include "gtest/gtest.h" #include "absl/functional/any_invocable_test.h" namespace absl_any_invocable_test {
diff --git a/absl/functional/any_invocable_test_inst3.cc b/absl/functional/any_invocable_test_inst3.cc index ba23e63..8d492b3 100644 --- a/absl/functional/any_invocable_test_inst3.cc +++ b/absl/functional/any_invocable_test_inst3.cc
@@ -18,6 +18,7 @@ // SKIP_ABSL_INLINE_NAMESPACE_CHECK +#include "gtest/gtest.h" #include "absl/functional/any_invocable_test.h" namespace absl_any_invocable_test {
diff --git a/absl/functional/any_invocable_test_inst4.cc b/absl/functional/any_invocable_test_inst4.cc index 0549a1e..ac21ca9 100644 --- a/absl/functional/any_invocable_test_inst4.cc +++ b/absl/functional/any_invocable_test_inst4.cc
@@ -18,6 +18,7 @@ // SKIP_ABSL_INLINE_NAMESPACE_CHECK +#include "gtest/gtest.h" #include "absl/functional/any_invocable_test.h" namespace absl_any_invocable_test {
diff --git a/absl/functional/bind_front.h b/absl/functional/bind_front.h index 4dcee39..45ca4fc 100644 --- a/absl/functional/bind_front.h +++ b/absl/functional/bind_front.h
@@ -30,6 +30,7 @@ #ifndef ABSL_FUNCTIONAL_BIND_FRONT_H_ #define ABSL_FUNCTIONAL_BIND_FRONT_H_ +#include "absl/base/config.h" #if __has_include(<version>) #include <version> #endif
diff --git a/absl/functional/bind_front_test.cc b/absl/functional/bind_front_test.cc index a759dbe..6e87d43 100644 --- a/absl/functional/bind_front_test.cc +++ b/absl/functional/bind_front_test.cc
@@ -19,6 +19,7 @@ #include <functional> #include <memory> #include <string> +#include <utility> #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -165,9 +166,7 @@ EXPECT_EQ(&s.value, &g()); } -int Sink(std::unique_ptr<int> p) { - return *p; -} +int Sink(std::unique_ptr<int> p) { return *p; } std::unique_ptr<int> Factory(int n) { return std::make_unique<int>(n); }
diff --git a/absl/functional/function_ref_test.cc b/absl/functional/function_ref_test.cc index 69513f4..a54865f 100644 --- a/absl/functional/function_ref_test.cc +++ b/absl/functional/function_ref_test.cc
@@ -14,6 +14,7 @@ #include "absl/functional/function_ref.h" +#include <atomic> #include <functional> #include <memory> #include <type_traits>
diff --git a/absl/functional/function_type_benchmark.cc b/absl/functional/function_type_benchmark.cc index 513233b..e4ba3a5 100644 --- a/absl/functional/function_type_benchmark.cc +++ b/absl/functional/function_type_benchmark.cc
@@ -17,6 +17,7 @@ #include <string> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/functional/any_invocable.h" #include "absl/functional/function_ref.h" #include "benchmark/benchmark.h"
diff --git a/absl/functional/internal/front_binder.h b/absl/functional/internal/front_binder.h index d0c3a5a..fcada9c 100644 --- a/absl/functional/internal/front_binder.h +++ b/absl/functional/internal/front_binder.h
@@ -21,6 +21,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/container/internal/compressed_tuple.h" #include "absl/meta/type_traits.h" #include "absl/utility/utility.h"
diff --git a/absl/functional/internal/function_ref.h b/absl/functional/internal/function_ref.h index 1e905fa..a6b3794 100644 --- a/absl/functional/internal/function_ref.h +++ b/absl/functional/internal/function_ref.h
@@ -19,6 +19,7 @@ #include <functional> #include <type_traits> +#include "absl/base/config.h" #include "absl/functional/any_invocable.h" #include "absl/meta/type_traits.h"
diff --git a/absl/hash/BUILD.bazel b/absl/hash/BUILD.bazel index b264ebf..5fae4e2 100644 --- a/absl/hash/BUILD.bazel +++ b/absl/hash/BUILD.bazel
@@ -72,6 +72,7 @@ visibility = ["//visibility:public"], deps = [ ":spy_hash_state", + "//absl/base:config", "//absl/meta:type_traits", "//absl/strings", "//absl/types:variant", @@ -158,6 +159,7 @@ deps = [ ":hash", ":weakly_mixed_integer", + "//absl/base:config", "//absl/strings", "//absl/strings:str_format", ], @@ -189,6 +191,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":city", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ],
diff --git a/absl/hash/hash.h b/absl/hash/hash.h index 7a76771..bfccf27 100644 --- a/absl/hash/hash.h +++ b/absl/hash/hash.h
@@ -22,6 +22,8 @@ // * The `absl::Hash` functor, which is used to invoke the hasher within the // Abseil hashing framework. `absl::Hash<T>` supports most basic types and // a number of Abseil types out of the box. +// * The `absl::TransparentHash` functor, which provides transparent hashing +// for heterogeneous lookup across multiple types in associative containers. // * `AbslHashValue`, an extension point that allows you to extend types to // support Abseil hashing without requiring you to define a hashing // algorithm. @@ -255,6 +257,89 @@ template <typename T> using Hash = absl::hash_internal::Hash<T>; +// TransparentHash +// +// `absl::TransparentHash<Ts...>` is a transparent hash functor that provides +// heterogeneous hashing across multiple types `Ts...` for associative +// containers such as `absl::flat_hash_set` and `absl::flat_hash_map`. +// +// It exposes `operator()(const T&)` overloads for each type `T` in `Ts...`, +// delegating each call to `absl::Hash<T>{}(value)`. It also defines the nested +// type alias `using is_transparent = void;`, signaling to containers that +// heterogeneous lookup is supported. +// +// If any type in `Ts...` is not hashable within the `absl::Hash` framework, +// `absl::TransparentHash` is poisoned (its call operators are disabled) in the +// same manner as `absl::Hash`. +// +// Duplicates types are allowed in `Ts...`. +// +// Requirements: +// +// For heterogeneous lookup to be correct, equivalent values across different +// types must produce identical hash values. That is, if `a == b`, then +// `TransparentHash{}(a) == TransparentHash{}(b)` must hold. This is typically +// satisfied when the `AbslHashValue()` implementations for each type combine +// identical fields in the same order. +// +// Usage: +// +// `absl::TransparentHash` can be used in two ways: +// +// 1. As an explicit `Hash` template argument to a container: +// +// absl::flat_hash_set<Name, absl::TransparentHash<Name, NameView>, +// NameEq> set; +// +// 2. As the nested `absl_container_hash` type alias within a user-defined key +// type: +// +// struct Name { +// ... +// using absl_container_hash = absl::TransparentHash<Name, NameView>; +// }; +// +// When `absl_container_hash` is defined in the key type, Abseil hash +// containers will automatically use it and enable heterogeneous lookup by +// default (using `std::equal_to<void>` for equality if `absl_container_eq` +// is not provided). +// +// Example: +// +// struct NameView { +// absl::string_view first; +// absl::string_view last; +// +// template <typename H> +// friend H AbslHashValue(H h, const NameView& nv) { +// return H::combine(std::move(h), nv.first, nv.last); +// } +// friend bool operator==(const NameView& a, const NameView& b); +// }; +// +// struct Name { +// std::string first; +// std::string last; +// +// template <typename H> +// friend H AbslHashValue(H h, const Name& n) { +// return H::combine(std::move(h), n.first, n.last); +// } +// friend bool operator==(const Name& a, const Name& b); +// friend bool operator==(const Name& a, const NameView& b); +// +// using absl_container_hash = absl::TransparentHash<Name, NameView>; +// }; +// +// absl::flat_hash_set<Name> names; +// names.insert(Name{"John", "Doe"}); +// +// // Look up using `NameView` without constructing a temporary `Name` or +// // allocating memory: +// assert(names.contains(NameView{"John", "Doe"})); +template <typename... Ts> +using TransparentHash = absl::hash_internal::TransparentHash<Ts...>; + // HashOf // // absl::HashOf() is a helper that generates a hash from the values of its
diff --git a/absl/hash/hash_test.cc b/absl/hash/hash_test.cc index d80ccb4..2afa986 100644 --- a/absl/hash/hash_test.cc +++ b/absl/hash/hash_test.cc
@@ -34,6 +34,7 @@ #include <tuple> #include <type_traits> #include <unordered_map> +#include <unordered_set> #include <utility> #include <variant> #include <vector> @@ -46,8 +47,6 @@ #include "absl/hash/hash_testing.h" #include "absl/hash/internal/hash_test.h" #include "absl/hash/internal/spy_hash_state.h" -#include "absl/memory/memory.h" -#include "absl/meta/type_traits.h" #include "absl/numeric/bits.h" #include "absl/strings/cord.h" #include "absl/strings/cord_test_helpers.h" @@ -1352,4 +1351,153 @@ } } +struct NameView { + absl::string_view name; + absl::string_view lang; + + friend bool operator==(const NameView& lhs, const NameView& rhs) { + return lhs.name == rhs.name && lhs.lang == rhs.lang; + } + + template <typename H> + friend H AbslHashValue(H h, const NameView& name) { + return H::combine(std::move(h), name.name, name.lang); + } +}; + +struct Name { + std::string name; + std::string lang; + + friend bool operator==(const Name& lhs, const Name& rhs) { + return lhs.name == rhs.name && lhs.lang == rhs.lang; + } + friend bool operator==(const NameView& lhs, const Name& rhs) { + return lhs.name == rhs.name && lhs.lang == rhs.lang; + } + friend bool operator==(const Name& lhs, const NameView& rhs) { + return lhs.name == rhs.name && lhs.lang == rhs.lang; + } + + template <typename H> + friend H AbslHashValue(H h, const Name& name) { + return H::combine(std::move(h), name.name, name.lang); + } + + using absl_container_hash = absl::TransparentHash<NameView, Name>; +}; + +template <typename NameHash> +class TransparentHashTest : public testing::Test {}; + +using NameHashTypes = + testing::Types<absl::TransparentHash<Name, NameView>, + absl::TransparentHash<Name, Name, NameView>, + absl::TransparentHash<Name, NameView, Name>, + absl::TransparentHash<Name, NameView, Name, NameView>, + absl::TransparentHash<Name, NameView, Name, NameView, Name, + NameView, Name>>; +TYPED_TEST_SUITE(TransparentHashTest, NameHashTypes); + +TYPED_TEST(TransparentHashTest, BasicUsage) { + using NameHash = TypeParam; + static_assert(std::is_same_v<typename NameHash::is_transparent, void>); + + EXPECT_FALSE((std::is_convertible_v<NameHash, absl::Hash<Name>>)); + EXPECT_FALSE((std::is_convertible_v<NameHash, absl::Hash<NameView>>)); + + EXPECT_EQ(NameHash{}(Name{"foo", "en"}), NameHash{}(NameView{"foo", "en"})); + + EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly( + std::make_tuple(Name{"foo", "en"}, NameView{"foo", "en"}, + Name{"bar", "en"}, NameView{"bar", "en"}, + Name{"foo", "de"}, NameView{"foo", "de"}, + Name{"bar", "de"}, NameView{"bar", "de"}))); + + absl::flat_hash_set<Name, NameHash, std::equal_to<>> set; + set.insert(Name{"foo", "en"}); + EXPECT_TRUE(set.contains(NameView{"foo", "en"})); + EXPECT_TRUE(set.contains(Name{"foo", "en"})); + + std::unordered_set<Name, NameHash, std::equal_to<>> std_set; + std_set.insert(Name{"foo", "en"}); + EXPECT_TRUE(std_set.find(Name{"foo", "en"}) != std_set.end()); +} + +TEST(HashTest, TransparentHashDefaultLookUp) { + absl::flat_hash_set<Name> set; + set.insert(Name{"foo", "en"}); + EXPECT_TRUE(set.contains(NameView{"foo", "en"})); + EXPECT_TRUE(set.contains(Name{"foo", "en"})); +} + +struct MyString { + std::string s; + + MyString() = default; + explicit MyString(absl::string_view s) : s(s) {} + explicit MyString(const char* s) : s(s) {} + + template <typename H> + friend H AbslHashValue(H h, const MyString& s) { + return H::combine(std::move(h), s.s); + } + + friend bool operator==(const MyString& lhs, const MyString& rhs) { + return lhs.s == rhs.s; + } + friend bool operator==(const MyString& lhs, absl::string_view rhs) { + return lhs.s == rhs; + } + friend bool operator==(absl::string_view lhs, const MyString& rhs) { + return lhs == rhs.s; + } +}; + +TEST(HashTest, TransparentHashDefaultLookUpAllowsImplicitCasting) { + EXPECT_EQ( + absl::Hash<absl::string_view>()("a"), + absl::TransparentHash<absl::string_view>()("a") + ); + absl::flat_hash_set<std::string, absl::TransparentHash<absl::string_view>> + set; + set.insert("a"); + EXPECT_TRUE(set.contains("a")); +} + +TEST(HashTest, TransparentHashDefaultLookUpAllowsImplicitCastingMultiArg) { + using TestHash = + absl::TransparentHash<absl::string_view, MyString>; + EXPECT_EQ(absl::Hash<absl::string_view>()("a"), TestHash()("a")); + absl::flat_hash_set<MyString, TestHash, std::equal_to<>> set; + set.emplace("a"); + EXPECT_TRUE(set.contains("a")); +} + +struct Unhashable {}; + +template <typename Hasher> +class TransparentPoisonedHashTest : public testing::Test {}; + +using TransparentPoisonedHashTypes = + testing::Types<absl::TransparentHash<Unhashable>, + absl::TransparentHash<Unhashable, Unhashable>, + absl::TransparentHash<int, Unhashable>, + absl::TransparentHash<int, Unhashable, int>, + absl::TransparentHash<int, Unhashable, int, Unhashable>>; +TYPED_TEST_SUITE(TransparentPoisonedHashTest, TransparentPoisonedHashTypes); + +TYPED_TEST(TransparentPoisonedHashTest, PoisonHash) { + using Hasher = TypeParam; + EXPECT_FALSE(std::is_default_constructible_v<Hasher>); + EXPECT_FALSE(std::is_copy_constructible_v<Hasher>); + EXPECT_FALSE(std::is_move_constructible_v<Hasher>); + EXPECT_FALSE(std::is_copy_assignable_v<Hasher>); + EXPECT_FALSE(std::is_move_assignable_v<Hasher>); +#if !defined(__GNUC__) || defined(__clang__) + // TODO(b/144368551): As of GCC 8.4 this does not compile. + EXPECT_FALSE(IsAggregateInitializable<Hasher>::value); +#endif +} + } // namespace
diff --git a/absl/hash/hash_testing.h b/absl/hash/hash_testing.h index d932f63..8b233fd 100644 --- a/absl/hash/hash_testing.h +++ b/absl/hash/hash_testing.h
@@ -26,6 +26,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/hash/internal/spy_hash_state.h" #include "absl/meta/type_traits.h" #include "absl/strings/str_cat.h"
diff --git a/absl/hash/internal/city_test.cc b/absl/hash/internal/city_test.cc index 822b399..57b7aa7 100644 --- a/absl/hash/internal/city_test.cc +++ b/absl/hash/internal/city_test.cc
@@ -21,6 +21,7 @@ #include <iostream> #include "gtest/gtest.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/hash/internal/hash.h b/absl/hash/internal/hash.h index a7dc74c..590bf7f 100644 --- a/absl/hash/internal/hash.h +++ b/absl/hash/internal/hash.h
@@ -1569,6 +1569,8 @@ PoisonedHash() = delete; PoisonedHash(const PoisonedHash&) = delete; PoisonedHash& operator=(const PoisonedHash&) = delete; + void operator()() const = delete; + size_t hash_with_seed() const = delete; }; template <typename T> @@ -1577,8 +1579,8 @@ return MixingHashState::hash(value); } - private: - friend struct HashWithSeed; + protected: + friend HashWithSeed; size_t hash_with_seed(const T& value, size_t seed) const { return MixingHashState::hash_with_seed(value, seed); @@ -1589,6 +1591,58 @@ struct Hash : std::conditional_t<is_hashable<T>::value, HashImpl<T>, PoisonedHash> {}; +template <typename T, typename... Ts> +inline constexpr bool pack_contains_v = (std::is_same_v<T, Ts> || ...); + +template <size_t> +struct EmptyDuplicatedHash { + void operator()() const = delete; + size_t hash_with_seed() const = delete; +}; + +template <typename... Ts> +class TransparentHashImpl; + +template <typename T> +class TransparentHashImpl<T> : private Hash<T> { + public: + using Hash<T>::operator(); + using Hash<T>::hash_with_seed; +}; + +template <typename T, typename... Ts> +using TransparentHashImplSingle = + std::conditional_t<pack_contains_v<T, Ts...>, + EmptyDuplicatedHash<sizeof...(Ts)>, Hash<T>>; + +template <typename T, typename... Ts> +class TransparentHashImpl<T, Ts...> + : private TransparentHashImpl<Ts...>, + private TransparentHashImplSingle<T, Ts...> { + public: + using TransparentHashImpl<Ts...>::operator(); + using TransparentHashImplSingle<T, Ts...>::operator(); + using TransparentHashImpl<Ts...>::hash_with_seed; + using TransparentHashImplSingle<T, Ts...>::hash_with_seed; +}; + +template <typename... Ts> +using TransparentHashBase = + std::conditional_t<(... && is_hashable<Ts>::value), + TransparentHashImpl<Ts...>, PoisonedHash>; + +template <typename... Ts> +class TransparentHash : private TransparentHashBase<Ts...> { + public: + using is_transparent = void; + using TransparentHashBase<Ts...>::operator(); + + private: + friend HashWithSeed; + + using TransparentHashBase<Ts...>::hash_with_seed; +}; + template <typename H> template <typename T, typename... Ts> H HashStateBase<H>::combine(H state, const T& value, const Ts&... values) {
diff --git a/absl/hash/internal/spy_hash_state.h b/absl/hash/internal/spy_hash_state.h index 543e719..ae7d595 100644 --- a/absl/hash/internal/spy_hash_state.h +++ b/absl/hash/internal/spy_hash_state.h
@@ -26,6 +26,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/hash/hash.h" #include "absl/hash/internal/weakly_mixed_integer.h" #include "absl/strings/match.h"
diff --git a/absl/log/BUILD.bazel b/absl/log/BUILD.bazel index 1e5bdc8..2c0a8ff 100644 --- a/absl/log/BUILD.bazel +++ b/absl/log/BUILD.bazel
@@ -514,6 +514,7 @@ ":check", ":log", ":log_entry", + ":log_sink", ":scoped_mock_log", "//absl/base:config", "//absl/base:core_headers",
diff --git a/absl/log/CMakeLists.txt b/absl/log/CMakeLists.txt index d3bc26d..ebc24f3 100644 --- a/absl/log/CMakeLists.txt +++ b/absl/log/CMakeLists.txt
@@ -1008,6 +1008,7 @@ absl::config absl::log absl::log_internal_test_matchers + absl::log_sink absl::scoped_mock_log absl::source_location absl::str_format
diff --git a/absl/log/internal/log_message.cc b/absl/log/internal/log_message.cc index 8ac81df..4e5da95 100644 --- a/absl/log/internal/log_message.cc +++ b/absl/log/internal/log_message.cc
@@ -219,7 +219,8 @@ void LogMessage::LogMessageData::InitializeEncodingAndFormat() { EncodeStringTruncate(EventTag::kFileName, entry.source_filename(), &encoded_remaining()); - EncodeVarint(EventTag::kFileLine, entry.source_line(), &encoded_remaining()); + EncodeVarint(EventTag::kFileLine, static_cast<int32_t>(entry.source_line()), + &encoded_remaining()); EncodeVarint(EventTag::kTimeNsecs, absl::ToUnixNanos(entry.timestamp()), &encoded_remaining()); EncodeVarint(EventTag::kSeverity,
diff --git a/absl/log/internal/proto.h b/absl/log/internal/proto.h index 23f7954..d2700ee 100644 --- a/absl/log/internal/proto.h +++ b/absl/log/internal/proto.h
@@ -79,6 +79,9 @@ inline bool EncodeVarint(uint64_t tag, int32_t value, absl::Span<char> *buf) { return EncodeVarint(tag, static_cast<uint64_t>(value), buf); } +inline bool EncodeVarint(uint64_t tag, bool value, absl::Span<char>* buf) { + return EncodeVarint(tag, static_cast<uint64_t>(value), buf); +} // Encodes the specified integer as a varint field using ZigZag encoding and // returns true if it fits.
diff --git a/absl/log/internal/structured_proto_test.cc b/absl/log/internal/structured_proto_test.cc index 80a3e7b..32a57c0 100644 --- a/absl/log/internal/structured_proto_test.cc +++ b/absl/log/internal/structured_proto_test.cc
@@ -77,6 +77,17 @@ {'\xD0', '\x02', '\x17'}, }, { + "VarintBool", + { + 42, + StructuredProtoField::Value{ + std::in_place_type<StructuredProtoField::Varint>, + true, + }, + }, + {'\xD0', '\x02', '\x01'}, + }, + { "I64", { 42,
diff --git a/absl/log/log_format_test.cc b/absl/log/log_format_test.cc index 5c9f05d..b792d38 100644 --- a/absl/log/log_format_test.cc +++ b/absl/log/log_format_test.cc
@@ -34,6 +34,7 @@ #include "absl/log/internal/test_matchers.h" #include "absl/log/log.h" #include "absl/log/log_entry.h" +#include "absl/log/log_sink.h" #include "absl/log/scoped_mock_log.h" #include "absl/strings/match.h" #include "absl/strings/str_cat.h"
diff --git a/absl/memory/BUILD.bazel b/absl/memory/BUILD.bazel index 92f9372..76fee58 100644 --- a/absl/memory/BUILD.bazel +++ b/absl/memory/BUILD.bazel
@@ -44,6 +44,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, visibility = ["//visibility:public"], deps = [ + "//absl/base:config", "//absl/base:core_headers", "//absl/meta:type_traits", ],
diff --git a/absl/memory/memory.h b/absl/memory/memory.h index cbc9812..5774be7 100644 --- a/absl/memory/memory.h +++ b/absl/memory/memory.h
@@ -31,6 +31,7 @@ #include <utility> #include <version> +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/meta/type_traits.h"
diff --git a/absl/numeric/BUILD.bazel b/absl/numeric/BUILD.bazel index d61606c..bc9670d 100644 --- a/absl/numeric/BUILD.bazel +++ b/absl/numeric/BUILD.bazel
@@ -73,6 +73,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":bits", + "//absl/base:config", "//absl/random", "@googletest//:gtest", "@googletest//:gtest_main",
diff --git a/absl/numeric/bits_test.cc b/absl/numeric/bits_test.cc index 30b5967..401de89 100644 --- a/absl/numeric/bits_test.cc +++ b/absl/numeric/bits_test.cc
@@ -20,6 +20,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/numeric/internal/bits.h" #include "absl/random/random.h"
diff --git a/absl/numeric/int128.cc b/absl/numeric/int128.cc index dc01c0f..a58b772 100644 --- a/absl/numeric/int128.cc +++ b/absl/numeric/int128.cc
@@ -27,6 +27,7 @@ #include <type_traits> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/numeric/bits.h"
diff --git a/absl/profiling/BUILD.bazel b/absl/profiling/BUILD.bazel index c5b49eb..2d9ecc6 100644 --- a/absl/profiling/BUILD.bazel +++ b/absl/profiling/BUILD.bazel
@@ -59,6 +59,7 @@ ], deps = [ ":sample_recorder", + "//absl/base:config", "//absl/base:core_headers", "//absl/random", "//absl/synchronization", @@ -93,6 +94,7 @@ visibility = ["//visibility:private"], deps = [ ":exponential_biased", + "//absl/base:config", "//absl/base:core_headers", "//absl/strings", "@googletest//:gtest", @@ -111,6 +113,7 @@ ], deps = [ ":exponential_biased", + "//absl/base:config", "//absl/base:core_headers", ], ) @@ -124,6 +127,7 @@ visibility = ["//visibility:private"], deps = [ ":periodic_sampler", + "//absl/base:config", "//absl/base:core_headers", "@googletest//:gtest", "@googletest//:gtest_main", @@ -140,6 +144,7 @@ visibility = ["//visibility:private"], deps = [ ":periodic_sampler", + "//absl/base:config", "//absl/base:core_headers", "@google_benchmark//:benchmark_main", ],
diff --git a/absl/profiling/hashtable.h b/absl/profiling/hashtable.h index 9e490dc..396dff5 100644 --- a/absl/profiling/hashtable.h +++ b/absl/profiling/hashtable.h
@@ -18,6 +18,7 @@ #include <cstdint> #include <string> +#include "absl/base/config.h" #include "absl/container/internal/hashtablez_sampler.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h"
diff --git a/absl/profiling/internal/exponential_biased.cc b/absl/profiling/internal/exponential_biased.cc index 918d063..8682ca1 100644 --- a/absl/profiling/internal/exponential_biased.cc +++ b/absl/profiling/internal/exponential_biased.cc
@@ -22,6 +22,7 @@ #include <limits> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/optimization.h" namespace absl {
diff --git a/absl/profiling/internal/exponential_biased_test.cc b/absl/profiling/internal/exponential_biased_test.cc index 103b7d5..3471b07 100644 --- a/absl/profiling/internal/exponential_biased_test.cc +++ b/absl/profiling/internal/exponential_biased_test.cc
@@ -26,6 +26,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/strings/str_cat.h" using ::testing::Ge;
diff --git a/absl/profiling/internal/periodic_sampler.cc b/absl/profiling/internal/periodic_sampler.cc index 3e0fc2f..20f2001 100644 --- a/absl/profiling/internal/periodic_sampler.cc +++ b/absl/profiling/internal/periodic_sampler.cc
@@ -17,6 +17,7 @@ #include <atomic> #include <cstdint> +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/profiling/internal/exponential_biased.h"
diff --git a/absl/profiling/internal/periodic_sampler.h b/absl/profiling/internal/periodic_sampler.h index f5d847a..0b4c500 100644 --- a/absl/profiling/internal/periodic_sampler.h +++ b/absl/profiling/internal/periodic_sampler.h
@@ -19,6 +19,7 @@ #include <atomic> +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/profiling/internal/exponential_biased.h"
diff --git a/absl/profiling/internal/periodic_sampler_benchmark.cc b/absl/profiling/internal/periodic_sampler_benchmark.cc index 2d6beca..b468b41 100644 --- a/absl/profiling/internal/periodic_sampler_benchmark.cc +++ b/absl/profiling/internal/periodic_sampler_benchmark.cc
@@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/profiling/internal/periodic_sampler.h" #include "benchmark/benchmark.h"
diff --git a/absl/profiling/internal/periodic_sampler_test.cc b/absl/profiling/internal/periodic_sampler_test.cc index d89b217..546454d 100644 --- a/absl/profiling/internal/periodic_sampler_test.cc +++ b/absl/profiling/internal/periodic_sampler_test.cc
@@ -20,6 +20,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" namespace absl {
diff --git a/absl/profiling/internal/profile_builder.h b/absl/profiling/internal/profile_builder.h index 243b927..7ab3eb6 100644 --- a/absl/profiling/internal/profile_builder.h +++ b/absl/profiling/internal/profile_builder.h
@@ -23,6 +23,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/container/btree_map.h" #include "absl/container/flat_hash_map.h" #include "absl/container/hash_container_defaults.h"
diff --git a/absl/profiling/internal/sample_recorder_test.cc b/absl/profiling/internal/sample_recorder_test.cc index 2401149..4e1437e 100644 --- a/absl/profiling/internal/sample_recorder_test.cc +++ b/absl/profiling/internal/sample_recorder_test.cc
@@ -24,6 +24,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/base/thread_annotations.h" #include "absl/random/random.h" #include "absl/synchronization/internal/thread_pool.h"
diff --git a/absl/random/gaussian_distribution.cc b/absl/random/gaussian_distribution.cc index c7a72cb..30ad3f0 100644 --- a/absl/random/gaussian_distribution.cc +++ b/absl/random/gaussian_distribution.cc
@@ -2,6 +2,7 @@ // clang-format off #include "absl/random/gaussian_distribution.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/random/internal/BUILD.bazel b/absl/random/internal/BUILD.bazel index 5b03203..efd013e 100644 --- a/absl/random/internal/BUILD.bazel +++ b/absl/random/internal/BUILD.bazel
@@ -238,6 +238,7 @@ linkopts = ABSL_DEFAULT_LINKOPTS, deps = [ ":seed_material", + "//absl/base:config", "//absl/container:inlined_vector", "//absl/meta:type_traits", "//absl/types:optional", @@ -267,6 +268,7 @@ deps = [ ":fastmath", ":traits", + "//absl/base:config", "//absl/meta:type_traits", "//absl/numeric:bits", ], @@ -279,7 +281,10 @@ ], copts = ABSL_DEFAULT_COPTS, linkopts = ABSL_DEFAULT_LINKOPTS, - deps = ["//absl/numeric:bits"], + deps = [ + "//absl/base:config", + "//absl/numeric:bits", + ], ) cc_library( @@ -335,6 +340,7 @@ deps = [ ":iostream_state_saver", ":randen", + "//absl/base:config", "//absl/base:endian", "//absl/meta:type_traits", ],
diff --git a/absl/random/internal/fastmath.h b/absl/random/internal/fastmath.h index 963b769..8f4f356 100644 --- a/absl/random/internal/fastmath.h +++ b/absl/random/internal/fastmath.h
@@ -22,6 +22,7 @@ #include <cmath> #include <cstdint> +#include "absl/base/config.h" #include "absl/numeric/bits.h" namespace absl {
diff --git a/absl/random/internal/generate_real.h b/absl/random/internal/generate_real.h index 6af0455..c547df7 100644 --- a/absl/random/internal/generate_real.h +++ b/absl/random/internal/generate_real.h
@@ -23,6 +23,7 @@ #include <limits> #include <type_traits> +#include "absl/base/config.h" #include "absl/meta/type_traits.h" #include "absl/numeric/bits.h" #include "absl/random/internal/fastmath.h"
diff --git a/absl/random/internal/randen.h b/absl/random/internal/randen.h index 6192333..75a2f42 100644 --- a/absl/random/internal/randen.h +++ b/absl/random/internal/randen.h
@@ -17,6 +17,7 @@ #include <cstddef> +#include "absl/base/config.h" #include "absl/random/internal/platform.h" #include "absl/random/internal/randen_hwaes.h" #include "absl/random/internal/randen_slow.h"
diff --git a/absl/random/internal/randen_engine.h b/absl/random/internal/randen_engine.h index a33736e..c2a8f54 100644 --- a/absl/random/internal/randen_engine.h +++ b/absl/random/internal/randen_engine.h
@@ -26,6 +26,7 @@ #include <ostream> #include <type_traits> +#include "absl/base/config.h" #include "absl/base/internal/endian.h" #include "absl/meta/type_traits.h" #include "absl/random/internal/iostream_state_saver.h"
diff --git a/absl/random/internal/salted_seed_seq.h b/absl/random/internal/salted_seed_seq.h index 68296e8..858a90f 100644 --- a/absl/random/internal/salted_seed_seq.h +++ b/absl/random/internal/salted_seed_seq.h
@@ -25,6 +25,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/container/inlined_vector.h" #include "absl/meta/type_traits.h" #include "absl/random/internal/seed_material.h"
diff --git a/absl/status/internal/statusor_internal.h b/absl/status/internal/statusor_internal.h index b086233..4de4641 100644 --- a/absl/status/internal/statusor_internal.h +++ b/absl/status/internal/statusor_internal.h
@@ -19,6 +19,7 @@ #include <utility> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/base/optimization.h" #include "absl/meta/type_traits.h"
diff --git a/absl/status/status.cc b/absl/status/status.cc index 80e8479..e9b0eab 100644 --- a/absl/status/status.cc +++ b/absl/status/status.cc
@@ -15,6 +15,7 @@ #include <errno.h> +#include <cstddef> #include <cstdint> #include <memory> #include <ostream> @@ -30,6 +31,7 @@ #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/types/source_location.h" +#include "absl/types/span.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/status/status_payload_printer.h b/absl/status/status_payload_printer.h index 7e2c8c8..bcf665b 100644 --- a/absl/status/status_payload_printer.h +++ b/absl/status/status_payload_printer.h
@@ -17,6 +17,7 @@ #include <optional> #include <string> +#include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/strings/cord.h" #include "absl/strings/string_view.h"
diff --git a/absl/status/statusor.h b/absl/status/statusor.h index 3d7f8c4..e56656a 100644 --- a/absl/status/statusor.h +++ b/absl/status/statusor.h
@@ -47,6 +47,7 @@ #include "absl/base/attributes.h" #include "absl/base/call_once.h" +#include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/meta/type_traits.h" #include "absl/status/internal/statusor_internal.h"
diff --git a/absl/status/statusor_test.cc b/absl/status/statusor_test.cc index 8a95049..2754d7b 100644 --- a/absl/status/statusor_test.cc +++ b/absl/status/statusor_test.cc
@@ -23,6 +23,7 @@ #include <memory> #include <ostream> #include <sstream> +#include <stdexcept> #include <string> #include <type_traits> #include <utility>
diff --git a/absl/strings/BUILD.bazel b/absl/strings/BUILD.bazel index 7a10c09..4505932 100644 --- a/absl/strings/BUILD.bazel +++ b/absl/strings/BUILD.bazel
@@ -248,6 +248,7 @@ ":str_format", ":string_view", ":strings", + "//absl/base:config", "//absl/base:core_headers", "//absl/container:fixed_array", "//absl/log:check", @@ -269,6 +270,7 @@ deps = [ ":string_view", ":strings", + "//absl/base:config", "//absl/base:raw_logging_internal", "@google_benchmark//:benchmark_main", ], @@ -382,6 +384,7 @@ visibility = ["//visibility:private"], deps = [ ":strings", + "//absl/base:config", "//absl/base:core_headers", "@google_benchmark//:benchmark_main", ], @@ -398,6 +401,7 @@ visibility = ["//visibility:private"], deps = [ ":strings", + "//absl/base:config", "//absl/base:core_headers", "@googletest//:gtest", "@googletest//:gtest_main", @@ -1532,6 +1536,7 @@ deps = [ ":str_format_internal", ":string_view", + "//absl/base:config", "//absl/types:span", "@googletest//:gtest", "@googletest//:gtest_main", @@ -1546,6 +1551,7 @@ deps = [ ":str_format", ":string_view", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -1584,6 +1590,7 @@ deps = [ ":cord", ":str_format_internal", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ], @@ -1623,6 +1630,7 @@ deps = [ ":pow10_helper", ":str_format", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ],
diff --git a/absl/strings/cord.h b/absl/strings/cord.h index cbba501..ef900f8 100644 --- a/absl/strings/cord.h +++ b/absl/strings/cord.h
@@ -190,10 +190,12 @@ // Creates a Cord from an existing Cord. Cord is copyable and efficiently // movable. The moved-from state is valid but unspecified. - Cord(const Cord& src); - Cord(Cord&& src) noexcept; - Cord& operator=(const Cord& x); - Cord& operator=(Cord&& x) noexcept; + // Moves need to be declared since they are otherwise inhibited via the + // declaration of the destructor. + Cord(const Cord&) = default; + Cord(Cord&&) = default; + Cord& operator=(const Cord&) = default; + Cord& operator=(Cord&&) = default; // Creates a Cord from a `src` string. This constructor is marked explicit to // prevent implicit Cord constructions from arguments convertible to an @@ -1376,11 +1378,6 @@ : &cord_internal::ConstInitExternalStorage< strings_internal::StringConstant<T>>::value) {} -inline Cord& Cord::operator=(const Cord& x) { - contents_ = x.contents_; - return *this; -} - template <typename T, Cord::EnableIfString<T>> Cord& Cord::operator=(T&& src) { if (src.size() <= cord_internal::kMaxBytesToCopy) { @@ -1390,19 +1387,10 @@ } } -inline Cord::Cord(const Cord& src) : contents_(src.contents_) {} - -inline Cord::Cord(Cord&& src) noexcept : contents_(std::move(src.contents_)) {} - inline void Cord::swap(Cord& other) noexcept { contents_.Swap(&other.contents_); } -inline Cord& Cord::operator=(Cord&& x) noexcept { - contents_ = std::move(x.contents_); - return *this; -} - extern template Cord::Cord(std::string&& src); inline size_t Cord::size() const {
diff --git a/absl/strings/escaping.h b/absl/strings/escaping.h index 0b0f8b2..66ff22c 100644 --- a/absl/strings/escaping.h +++ b/absl/strings/escaping.h
@@ -30,6 +30,7 @@ #include <vector> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/base/nullability.h" #include "absl/strings/ascii.h" @@ -183,7 +184,7 @@ // Converts an ASCII hex string into bytes, returning binary data of length // `from.size()/2`. The input must be valid hexadecimal data, otherwise the // return value is unspecified. -ABSL_DEPRECATED("Use the HexStringToBytes() that returns a bool") +[[deprecated("Use the HexStringToBytes() that returns a bool")]] std::string HexStringToBytes(absl::string_view from); // BytesToHexString()
diff --git a/absl/strings/internal/charconv_bigint.cc b/absl/strings/internal/charconv_bigint.cc index e91e90b..7ca850d 100644 --- a/absl/strings/internal/charconv_bigint.cc +++ b/absl/strings/internal/charconv_bigint.cc
@@ -20,6 +20,7 @@ #include <iterator> #include <string> +#include "absl/base/config.h" #include "absl/strings/internal/charconv_parse.h" namespace absl {
diff --git a/absl/strings/internal/charconv_bigint_test.cc b/absl/strings/internal/charconv_bigint_test.cc index 8d9f62d..2661e8b 100644 --- a/absl/strings/internal/charconv_bigint_test.cc +++ b/absl/strings/internal/charconv_bigint_test.cc
@@ -19,6 +19,7 @@ #include <string> #include "gtest/gtest.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/strings/internal/charconv_parse.cc b/absl/strings/internal/charconv_parse.cc index 2766cf3..5f9df0a 100644 --- a/absl/strings/internal/charconv_parse.cc +++ b/absl/strings/internal/charconv_parse.cc
@@ -19,6 +19,7 @@ #include <cstdint> #include <limits> +#include "absl/base/config.h" #include "absl/strings/charconv.h" #include "absl/strings/internal/memutil.h"
diff --git a/absl/strings/internal/cord_data_edge_test.cc b/absl/strings/internal/cord_data_edge_test.cc index 58046fe..54ec8ff 100644 --- a/absl/strings/internal/cord_data_edge_test.cc +++ b/absl/strings/internal/cord_data_edge_test.cc
@@ -16,6 +16,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_test_util.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/cord_internal.cc b/absl/strings/internal/cord_internal.cc index 79e4461..3d1c324 100644 --- a/absl/strings/internal/cord_internal.cc +++ b/absl/strings/internal/cord_internal.cc
@@ -18,6 +18,7 @@ #include <memory> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/container/inlined_vector.h" #include "absl/strings/internal/cord_rep_btree.h"
diff --git a/absl/strings/internal/cord_rep_btree_navigator.cc b/absl/strings/internal/cord_rep_btree_navigator.cc index 707e5c8..d524fff 100644 --- a/absl/strings/internal/cord_rep_btree_navigator.cc +++ b/absl/strings/internal/cord_rep_btree_navigator.cc
@@ -18,6 +18,7 @@ #include <cstddef> #include <cstdint> +#include "absl/base/config.h" #include "absl/strings/internal/cord_data_edge.h" #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_btree.h"
diff --git a/absl/strings/internal/cord_rep_btree_navigator.h b/absl/strings/internal/cord_rep_btree_navigator.h index 1024525..d59494d 100644 --- a/absl/strings/internal/cord_rep_btree_navigator.h +++ b/absl/strings/internal/cord_rep_btree_navigator.h
@@ -20,6 +20,7 @@ #include <cstdint> #include <iostream> +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/strings/internal/cord_internal.h" #include "absl/strings/internal/cord_rep_btree.h"
diff --git a/absl/strings/internal/cord_rep_consume.cc b/absl/strings/internal/cord_rep_consume.cc index 8b6af15..4f2717f 100644 --- a/absl/strings/internal/cord_rep_consume.cc +++ b/absl/strings/internal/cord_rep_consume.cc
@@ -18,6 +18,7 @@ #include <cstddef> #include <utility> +#include "absl/base/config.h" #include "absl/container/inlined_vector.h" #include "absl/functional/function_ref.h" #include "absl/strings/internal/cord_internal.h"
diff --git a/absl/strings/internal/cord_rep_consume.h b/absl/strings/internal/cord_rep_consume.h index cdb06ba..c35b5da 100644 --- a/absl/strings/internal/cord_rep_consume.h +++ b/absl/strings/internal/cord_rep_consume.h
@@ -18,6 +18,7 @@ #include <cstddef> #include <functional> +#include "absl/base/config.h" #include "absl/functional/function_ref.h" #include "absl/strings/internal/cord_internal.h"
diff --git a/absl/strings/internal/cord_rep_flat.h b/absl/strings/internal/cord_rep_flat.h index 9a2604b..fab6e71 100644 --- a/absl/strings/internal/cord_rep_flat.h +++ b/absl/strings/internal/cord_rep_flat.h
@@ -22,9 +22,11 @@ #include <cstring> #include <memory> +#include "absl/base/attributes.h" #include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/strings/internal/cord_internal.h" +#include "absl/strings/string_view.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/strings/internal/cordz_handle.cc b/absl/strings/internal/cordz_handle.cc index 4fa8183..8e34856 100644 --- a/absl/strings/internal/cordz_handle.cc +++ b/absl/strings/internal/cordz_handle.cc
@@ -17,6 +17,7 @@ #include <cassert> #include <vector> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" // For ABSL_RAW_CHECK #include "absl/base/macros.h" #include "absl/base/no_destructor.h"
diff --git a/absl/strings/internal/cordz_handle_test.cc b/absl/strings/internal/cordz_handle_test.cc index f2deea2..b748a8f 100644 --- a/absl/strings/internal/cordz_handle_test.cc +++ b/absl/strings/internal/cordz_handle_test.cc
@@ -19,6 +19,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/memory/memory.h" #include "absl/synchronization/internal/thread_pool.h" #include "absl/synchronization/notification.h"
diff --git a/absl/strings/internal/cordz_sample_token_test.cc b/absl/strings/internal/cordz_sample_token_test.cc index 8386b2c..dad228a 100644 --- a/absl/strings/internal/cordz_sample_token_test.cc +++ b/absl/strings/internal/cordz_sample_token_test.cc
@@ -22,6 +22,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/memory/memory.h" #include "absl/random/random.h" #include "absl/strings/cordz_test_helpers.h"
diff --git a/absl/strings/internal/escaping.cc b/absl/strings/internal/escaping.cc index 3c206b4..6b66e53 100644 --- a/absl/strings/internal/escaping.cc +++ b/absl/strings/internal/escaping.cc
@@ -17,6 +17,7 @@ #include <cstddef> #include <limits> +#include "absl/base/config.h" #include "absl/base/internal/endian.h" #include "absl/base/internal/raw_logging.h"
diff --git a/absl/strings/internal/escaping_test_common.h b/absl/strings/internal/escaping_test_common.h index 7b18017..82e1b5a 100644 --- a/absl/strings/internal/escaping_test_common.h +++ b/absl/strings/internal/escaping_test_common.h
@@ -19,6 +19,8 @@ #define ABSL_STRINGS_INTERNAL_ESCAPING_TEST_COMMON_H_ #include <array> + +#include "absl/base/config.h" #include "absl/strings/string_view.h" namespace absl {
diff --git a/absl/strings/internal/generic_printer.h b/absl/strings/internal/generic_printer.h index ed60155..15b0ce3 100644 --- a/absl/strings/internal/generic_printer.h +++ b/absl/strings/internal/generic_printer.h
@@ -76,6 +76,8 @@ #include <ostream> #include <utility> +#include "absl/base/config.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace strings_internal {
diff --git a/absl/strings/internal/memutil.cc b/absl/strings/internal/memutil.cc index 0bbd8aa..b54e5b5 100644 --- a/absl/strings/internal/memutil.cc +++ b/absl/strings/internal/memutil.cc
@@ -16,6 +16,7 @@ #include <cstdlib> +#include "absl/base/config.h" #include "absl/strings/ascii.h" namespace absl {
diff --git a/absl/strings/internal/memutil.h b/absl/strings/internal/memutil.h index b5911a0..de4dbd1 100644 --- a/absl/strings/internal/memutil.h +++ b/absl/strings/internal/memutil.h
@@ -20,6 +20,7 @@ #include <cstddef> #include <cstring> +#include "absl/base/config.h" #include "absl/base/port.h" // disable some warnings on Windows #include "absl/strings/ascii.h" // for absl::ascii_tolower
diff --git a/absl/strings/internal/ostringstream.cc b/absl/strings/internal/ostringstream.cc index a0e5ec0..5ac41cc 100644 --- a/absl/strings/internal/ostringstream.cc +++ b/absl/strings/internal/ostringstream.cc
@@ -19,6 +19,8 @@ #include <ios> #include <streambuf> +#include "absl/base/config.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace strings_internal {
diff --git a/absl/strings/internal/pow10_helper.cc b/absl/strings/internal/pow10_helper.cc index 42e96c3..8f85310 100644 --- a/absl/strings/internal/pow10_helper.cc +++ b/absl/strings/internal/pow10_helper.cc
@@ -16,6 +16,8 @@ #include <cmath> +#include "absl/base/config.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace strings_internal {
diff --git a/absl/strings/internal/pow10_helper_test.cc b/absl/strings/internal/pow10_helper_test.cc index 4e1f34b..ac34609 100644 --- a/absl/strings/internal/pow10_helper_test.cc +++ b/absl/strings/internal/pow10_helper_test.cc
@@ -18,6 +18,7 @@ #include <cstdint> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/str_format.h" namespace absl {
diff --git a/absl/strings/internal/resize_uninitialized.h b/absl/strings/internal/resize_uninitialized.h index a2fcab1..43f2e0b 100644 --- a/absl/strings/internal/resize_uninitialized.h +++ b/absl/strings/internal/resize_uninitialized.h
@@ -23,6 +23,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/base/optimization.h" #include "absl/base/port.h" #include "absl/strings/resize_and_overwrite.h"
diff --git a/absl/strings/internal/str_format/bind_test.cc b/absl/strings/internal/str_format/bind_test.cc index c4fb200..580d818 100644 --- a/absl/strings/internal/str_format/bind_test.cc +++ b/absl/strings/internal/str_format/bind_test.cc
@@ -19,6 +19,7 @@ #include <limits> #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/internal/str_format/arg.h" #include "absl/strings/internal/str_format/constexpr_parser.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/str_format/checker.h b/absl/strings/internal/str_format/checker.h index 14e9a23..9975575 100644 --- a/absl/strings/internal/str_format/checker.h +++ b/absl/strings/internal/str_format/checker.h
@@ -19,6 +19,7 @@ #include <cstddef> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/const_init.h" #include "absl/strings/internal/str_format/arg.h" #include "absl/strings/internal/str_format/constexpr_parser.h"
diff --git a/absl/strings/internal/str_format/checker_test.cc b/absl/strings/internal/str_format/checker_test.cc index 21f1a7f..dff85be 100644 --- a/absl/strings/internal/str_format/checker_test.cc +++ b/absl/strings/internal/str_format/checker_test.cc
@@ -16,6 +16,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/str_format/convert_test.cc b/absl/strings/internal/str_format/convert_test.cc index 46b8588..fc7d9ba 100644 --- a/absl/strings/internal/str_format/convert_test.cc +++ b/absl/strings/internal/str_format/convert_test.cc
@@ -37,6 +37,8 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/base/attributes.h" +#include "absl/base/casts.h" +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/log/absl_check.h" #include "absl/log/log.h"
diff --git a/absl/strings/internal/str_format/extension.cc b/absl/strings/internal/str_format/extension.cc index 5b16a86..74f9079 100644 --- a/absl/strings/internal/str_format/extension.cc +++ b/absl/strings/internal/str_format/extension.cc
@@ -21,6 +21,7 @@ #include <cstddef> #include <string> +#include "absl/base/config.h" #include "absl/strings/string_view.h" namespace absl {
diff --git a/absl/strings/internal/str_format/float_conversion.h b/absl/strings/internal/str_format/float_conversion.h index 71100e7..35eab5f 100644 --- a/absl/strings/internal/str_format/float_conversion.h +++ b/absl/strings/internal/str_format/float_conversion.h
@@ -15,6 +15,7 @@ #ifndef ABSL_STRINGS_INTERNAL_STR_FORMAT_FLOAT_CONVERSION_H_ #define ABSL_STRINGS_INTERNAL_STR_FORMAT_FLOAT_CONVERSION_H_ +#include "absl/base/config.h" #include "absl/strings/internal/str_format/extension.h" namespace absl {
diff --git a/absl/strings/internal/str_format/output.cc b/absl/strings/internal/str_format/output.cc index 1e61d19..f541669 100644 --- a/absl/strings/internal/str_format/output.cc +++ b/absl/strings/internal/str_format/output.cc
@@ -20,6 +20,7 @@ #include <cstdio> #include <cstring> +#include "absl/base/config.h" #include "absl/strings/string_view.h" namespace absl {
diff --git a/absl/strings/internal/str_format/output.h b/absl/strings/internal/str_format/output.h index 15e751a..6afb97a 100644 --- a/absl/strings/internal/str_format/output.h +++ b/absl/strings/internal/str_format/output.h
@@ -26,6 +26,7 @@ #include <ostream> #include <string> +#include "absl/base/config.h" #include "absl/base/port.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/str_format/output_test.cc b/absl/strings/internal/str_format/output_test.cc index 83c9589..ad319e3 100644 --- a/absl/strings/internal/str_format/output_test.cc +++ b/absl/strings/internal/str_format/output_test.cc
@@ -20,6 +20,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/strings/cord.h" namespace absl {
diff --git a/absl/strings/internal/str_format/parser.cc b/absl/strings/internal/str_format/parser.cc index 475d221..35ec143 100644 --- a/absl/strings/internal/str_format/parser.cc +++ b/absl/strings/internal/str_format/parser.cc
@@ -28,6 +28,7 @@ #include <unordered_set> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/strings/internal/str_format/constexpr_parser.h" #include "absl/strings/internal/str_format/extension.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/str_split_internal.h b/absl/strings/internal/str_split_internal.h index b36eac1..c7cc087 100644 --- a/absl/strings/internal/str_split_internal.h +++ b/absl/strings/internal/str_split_internal.h
@@ -41,6 +41,7 @@ #include <vector> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/base/port.h" #include "absl/meta/type_traits.h"
diff --git a/absl/strings/internal/string_constant.h b/absl/strings/internal/string_constant.h index d52c330..68517a5 100644 --- a/absl/strings/internal/string_constant.h +++ b/absl/strings/internal/string_constant.h
@@ -15,6 +15,7 @@ #ifndef ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_ #define ABSL_STRINGS_INTERNAL_STRING_CONSTANT_H_ +#include "absl/base/config.h" #include "absl/meta/type_traits.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/internal/stringify_sink.cc b/absl/strings/internal/stringify_sink.cc index 4efe80f..c9f8258 100644 --- a/absl/strings/internal/stringify_sink.cc +++ b/absl/strings/internal/stringify_sink.cc
@@ -16,7 +16,9 @@ #include <cstddef> +#include "absl/base/config.h" #include "absl/strings/string_view.h" + namespace absl { ABSL_NAMESPACE_BEGIN namespace strings_internal {
diff --git a/absl/strings/internal/stringify_sink.h b/absl/strings/internal/stringify_sink.h index b2e75d9..e4e5f9e 100644 --- a/absl/strings/internal/stringify_sink.h +++ b/absl/strings/internal/stringify_sink.h
@@ -21,6 +21,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/strings/numbers.h" #include "absl/strings/string_view.h" #include "absl/types/source_location.h"
diff --git a/absl/strings/match.h b/absl/strings/match.h index ce4fe78..431d4f5 100644 --- a/absl/strings/match.h +++ b/absl/strings/match.h
@@ -35,6 +35,7 @@ #include <cstring> +#include "absl/base/config.h" #include "absl/strings/string_view.h" namespace absl {
diff --git a/absl/strings/str_join.h b/absl/strings/str_join.h index dd9f7f4..ccd437a 100644 --- a/absl/strings/str_join.h +++ b/absl/strings/str_join.h
@@ -55,6 +55,7 @@ #include <type_traits> #include <utility> +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/strings/internal/str_join_internal.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/str_replace.h b/absl/strings/str_replace.h index ac1dcac..3af2357 100644 --- a/absl/strings/str_replace.h +++ b/absl/strings/str_replace.h
@@ -45,6 +45,7 @@ #include <vector> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/nullability.h" #include "absl/strings/string_view.h"
diff --git a/absl/strings/str_split.h b/absl/strings/str_split.h index b72b446..e86b29a 100644 --- a/absl/strings/str_split.h +++ b/absl/strings/str_split.h
@@ -44,6 +44,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/base/internal/raw_logging.h" #include "absl/base/macros.h" #include "absl/strings/ascii.h" @@ -467,8 +468,10 @@ // std::set<std::string> a = absl::StrSplit("b,a,c,a,b", ','); // // a[0] == "a", a[1] == "b", a[2] == "c" // -// // `StrSplit()` can be used within a range-based for loop, in which case -// // each element will be of type `absl::string_view`. +// // `StrSplit()` can be used within a range-based for-loop, in which case +// // each element will be of type `absl::string_view`. The elements will +// // returned in the order in which they appear in the original string +// // without any other transformation, e.g. no de-duplication is performed. // std::vector<std::string> v; // for (const auto sv : absl::StrSplit("a,b,c", ',')) { // if (sv != "b") v.emplace_back(sv);
diff --git a/absl/strings/string_view.h b/absl/strings/string_view.h index 9daa149..97f7729 100644 --- a/absl/strings/string_view.h +++ b/absl/strings/string_view.h
@@ -24,6 +24,7 @@ #ifndef ABSL_STRINGS_STRING_VIEW_H_ #define ABSL_STRINGS_STRING_VIEW_H_ +#include <algorithm> #include <string_view> #include "absl/base/attributes.h"
diff --git a/absl/strings/strip.h b/absl/strings/strip.h index 55398ff..aa225ad 100644 --- a/absl/strings/strip.h +++ b/absl/strings/strip.h
@@ -25,6 +25,7 @@ #include <string> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/base/nullability.h" #include "absl/strings/ascii.h"
diff --git a/absl/strings/substitute.h b/absl/strings/substitute.h index accf26e..6c62af6 100644 --- a/absl/strings/substitute.h +++ b/absl/strings/substitute.h
@@ -78,6 +78,7 @@ #include <type_traits> #include <vector> +#include "absl/base/config.h" #include "absl/base/macros.h" #include "absl/base/nullability.h" #include "absl/base/port.h"
diff --git a/absl/synchronization/BUILD.bazel b/absl/synchronization/BUILD.bazel index d5438ba..c63ba86 100644 --- a/absl/synchronization/BUILD.bazel +++ b/absl/synchronization/BUILD.bazel
@@ -248,6 +248,7 @@ ], deps = [ ":synchronization", + "//absl/base:config", "//absl/base:core_headers", "//absl/functional:any_invocable", ],
diff --git a/absl/synchronization/barrier.h b/absl/synchronization/barrier.h index d8e7544..600ac30 100644 --- a/absl/synchronization/barrier.h +++ b/absl/synchronization/barrier.h
@@ -19,6 +19,7 @@ #ifndef ABSL_SYNCHRONIZATION_BARRIER_H_ #define ABSL_SYNCHRONIZATION_BARRIER_H_ +#include "absl/base/config.h" #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h"
diff --git a/absl/synchronization/blocking_counter.h b/absl/synchronization/blocking_counter.h index 46c010b..ad622ad 100644 --- a/absl/synchronization/blocking_counter.h +++ b/absl/synchronization/blocking_counter.h
@@ -22,6 +22,7 @@ #include <atomic> +#include "absl/base/config.h" #include "absl/base/internal/tracing.h" #include "absl/base/thread_annotations.h" #include "absl/synchronization/mutex.h"
diff --git a/absl/synchronization/internal/create_thread_identity.h b/absl/synchronization/internal/create_thread_identity.h index f8bfbe9..0e5dd53 100644 --- a/absl/synchronization/internal/create_thread_identity.h +++ b/absl/synchronization/internal/create_thread_identity.h
@@ -25,6 +25,7 @@ #ifndef ABSL_SYNCHRONIZATION_INTERNAL_CREATE_THREAD_IDENTITY_H_ #define ABSL_SYNCHRONIZATION_INTERNAL_CREATE_THREAD_IDENTITY_H_ +#include "absl/base/config.h" #include "absl/base/internal/thread_identity.h" #include "absl/base/optimization.h" #include "absl/base/port.h"
diff --git a/absl/synchronization/internal/per_thread_sem.h b/absl/synchronization/internal/per_thread_sem.h index 7d1099e..aa44062 100644 --- a/absl/synchronization/internal/per_thread_sem.h +++ b/absl/synchronization/internal/per_thread_sem.h
@@ -27,6 +27,7 @@ #include <atomic> +#include "absl/base/config.h" #include "absl/base/internal/thread_identity.h" #include "absl/synchronization/internal/create_thread_identity.h" #include "absl/synchronization/internal/kernel_timeout.h"
diff --git a/absl/synchronization/internal/thread_pool.h b/absl/synchronization/internal/thread_pool.h index f87adf6..83c8a9e 100644 --- a/absl/synchronization/internal/thread_pool.h +++ b/absl/synchronization/internal/thread_pool.h
@@ -23,6 +23,7 @@ #include <utility> #include <vector> +#include "absl/base/config.h" #include "absl/base/thread_annotations.h" #include "absl/functional/any_invocable.h" #include "absl/synchronization/mutex.h"
diff --git a/absl/synchronization/mutex.cc b/absl/synchronization/mutex.cc index be0d91a..d6e2aac 100644 --- a/absl/synchronization/mutex.cc +++ b/absl/synchronization/mutex.cc
@@ -2788,7 +2788,9 @@ } #ifdef ABSL_HAVE_THREAD_SANITIZER +#pragma GCC visibility push(default) extern "C" void __tsan_read1(void* addr); +#pragma GCC visibility pop #else #define __tsan_read1(addr) // do nothing if TSan not enabled #endif
diff --git a/absl/time/CMakeLists.txt b/absl/time/CMakeLists.txt index 7b3e5d6..b141b62 100644 --- a/absl/time/CMakeLists.txt +++ b/absl/time/CMakeLists.txt
@@ -77,8 +77,8 @@ "internal/cctz/src/time_zone_posix.h" "internal/cctz/src/tzfile.h" "internal/cctz/src/zone_info_source.cc" - $<$<PLATFORM_ID:Windows>:internal/cctz/src/time_zone_name_win.cc> - $<$<PLATFORM_ID:Windows>:internal/cctz/src/time_zone_name_win.h> + $<$<PLATFORM_ID:Windows,WindowsStore>:internal/cctz/src/time_zone_name_win.cc> + $<$<PLATFORM_ID:Windows,WindowsStore>:internal/cctz/src/time_zone_name_win.h> COPTS ${ABSL_DEFAULT_COPTS} DEPS
diff --git a/absl/time/civil_time.cc b/absl/time/civil_time.cc index 33160a7..a704247 100644 --- a/absl/time/civil_time.cc +++ b/absl/time/civil_time.cc
@@ -19,6 +19,7 @@ #include <ostream> #include <string> +#include "absl/base/config.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "absl/time/time.h"
diff --git a/absl/time/clock.cc b/absl/time/clock.cc index a5724df..d368659 100644 --- a/absl/time/clock.cc +++ b/absl/time/clock.cc
@@ -22,6 +22,7 @@ #include <limits> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/base/internal/spinlock.h" #include "absl/base/internal/unscaledcycleclock.h" #include "absl/base/internal/unscaledcycleclock_config.h"
diff --git a/absl/time/format.cc b/absl/time/format.cc index 217da58..0794d7d 100644 --- a/absl/time/format.cc +++ b/absl/time/format.cc
@@ -20,6 +20,7 @@ #include <string> #include <utility> +#include "absl/base/config.h" #include "absl/strings/ascii.h" #include "absl/strings/match.h" #include "absl/strings/string_view.h"
diff --git a/absl/time/internal/test_util.h b/absl/time/internal/test_util.h index 5c4bf1f..7a861d8 100644 --- a/absl/time/internal/test_util.h +++ b/absl/time/internal/test_util.h
@@ -17,6 +17,7 @@ #include <string> +#include "absl/base/config.h" #include "absl/time/time.h" namespace absl {
diff --git a/absl/time/time.cc b/absl/time/time.cc index 4077e2d..fee9901 100644 --- a/absl/time/time.cc +++ b/absl/time/time.cc
@@ -40,6 +40,7 @@ #include <limits> #include "absl/base/attributes.h" +#include "absl/base/config.h" #include "absl/time/civil_time.h" #include "absl/time/internal/cctz/include/cctz/civil_time.h" #include "absl/time/internal/cctz/include/cctz/time_zone.h"
diff --git a/absl/time/time.h b/absl/time/time.h index ea9be32..b2bfcb2 100644 --- a/absl/time/time.h +++ b/absl/time/time.h
@@ -737,9 +737,9 @@ // the format specified by `absl::ParseDuration()`. std::string AbslUnparseFlag(Duration d); -ABSL_DEPRECATED("Use AbslParseFlag() instead.") +[[deprecated("Use AbslParseFlag() instead.")]] bool ParseFlag(const std::string& text, Duration* dst, std::string* error); -ABSL_DEPRECATED("Use AbslUnparseFlag() instead.") +[[deprecated("Use AbslUnparseFlag() instead.")]] std::string UnparseFlag(Duration d); // Time @@ -824,7 +824,7 @@ // `absl::TimeZone`. // // Deprecated. Use `absl::TimeZone::CivilInfo`. - struct ABSL_DEPRECATED("Use `absl::TimeZone::CivilInfo`.") Breakdown { + struct [[deprecated("Use `absl::TimeZone::CivilInfo`.")]] Breakdown { int64_t year; // year (e.g., 2013) int month; // month of year [1:12] int day; // day of month [1:31] @@ -851,7 +851,7 @@ // // Deprecated. Use `absl::TimeZone::At(Time)`. ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING - ABSL_DEPRECATED("Use `absl::TimeZone::At(Time)`.") + [[deprecated("Use `absl::TimeZone::At(Time)`.")]] Breakdown In(TimeZone tz) const; ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING @@ -1356,7 +1356,7 @@ // `absl::ConvertDateTime()`. Legacy version of `absl::TimeZone::TimeInfo`. // // Deprecated. Use `absl::TimeZone::TimeInfo`. -struct ABSL_DEPRECATED("Use `absl::TimeZone::TimeInfo`.") TimeConversion { +struct [[deprecated("Use `absl::TimeZone::TimeInfo`.")]] TimeConversion { Time pre; // time calculated using the pre-transition offset Time trans; // when the civil-time discontinuity occurred Time post; // time calculated using the post-transition offset @@ -1391,7 +1391,7 @@ // // Deprecated. Use `absl::TimeZone::At(CivilSecond)`. ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING -ABSL_DEPRECATED("Use `absl::TimeZone::At(CivilSecond)`.") +[[deprecated("Use `absl::TimeZone::At(CivilSecond)`.")]] TimeConversion ConvertDateTime(int64_t year, int mon, int day, int hour, int min, int sec, TimeZone tz); ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING @@ -1411,7 +1411,7 @@ // Deprecated. Use `absl::FromCivil(CivilSecond, TimeZone)`. Note that the // behavior of `FromCivil()` differs from `FromDateTime()` for skipped civil // times. If you care about that see `absl::TimeZone::At(absl::CivilSecond)`. -ABSL_DEPRECATED("Use `absl::FromCivil(CivilSecond, TimeZone)`.") +[[deprecated("Use `absl::FromCivil(CivilSecond, TimeZone)`.")]] inline Time FromDateTime(int64_t year, int mon, int day, int hour, int min, int sec, TimeZone tz) { ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING
diff --git a/absl/time/time_test.cc b/absl/time/time_test.cc index 7d67ca0..0572567 100644 --- a/absl/time/time_test.cc +++ b/absl/time/time_test.cc
@@ -14,17 +14,7 @@ #include "absl/time/time.h" -#include "absl/base/config.h" - -// For feature testing and determining which headers can be included. -#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L -#include <version> -#endif - #include <chrono> // NOLINT(build/c++11) -#ifdef __cpp_lib_three_way_comparison -#include <compare> -#endif // __cpp_lib_three_way_comparison #include <cstdint> #include <cstring> #include <ctime> @@ -37,6 +27,7 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include "absl/base/config.h" #include "absl/hash/hash_testing.h" #include "absl/numeric/int128.h" #include "absl/strings/str_format.h" @@ -44,6 +35,15 @@ #include "absl/time/clock.h" #include "absl/time/internal/test_util.h" +// For feature testing and determining which headers can be included. +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L +#include <version> +#endif + +#ifdef __cpp_lib_three_way_comparison +#include <compare> +#endif // __cpp_lib_three_way_comparison + #if defined(_MSC_VER) #include <winsock2.h> // for timeval #endif
diff --git a/absl/types/BUILD.bazel b/absl/types/BUILD.bazel index 3ccd28e..f36fc4b 100644 --- a/absl/types/BUILD.bazel +++ b/absl/types/BUILD.bazel
@@ -242,6 +242,7 @@ deps = [ ":compare", "//absl/base", + "//absl/base:config", "@googletest//:gtest", "@googletest//:gtest_main", ],
diff --git a/absl/types/any_span_test.cc b/absl/types/any_span_test.cc index e5960c6..5d61f6b 100644 --- a/absl/types/any_span_test.cc +++ b/absl/types/any_span_test.cc
@@ -20,6 +20,7 @@ #include <iterator> #include <memory> #include <optional> +#include <stdexcept> #include <string> #include <string_view> #include <type_traits> @@ -1056,9 +1057,9 @@ EXPECT_DEATH(span.subspan(5, 1), ""); EXPECT_DEATH(span.subspan(AnySpan<int>::npos, 0), ""); EXPECT_DEATH(span.subspan(AnySpan<int>::npos, 1), ""); - EXPECT_DEATH(span.subspan(0, 5), ""); - EXPECT_DEATH(span.first(5), ""); - EXPECT_DEATH(span.first(AnySpan<int>::npos), ""); + EXPECT_DEATH(span.subspan(0, 5), ""); + EXPECT_DEATH(span.first(5), ""); + EXPECT_DEATH(span.first(AnySpan<int>::npos), ""); } #endif }
diff --git a/absl/types/compare_test.cc b/absl/types/compare_test.cc index ae73eca..22276e8 100644 --- a/absl/types/compare_test.cc +++ b/absl/types/compare_test.cc
@@ -14,8 +14,12 @@ #include "absl/types/compare.h" +#include <algorithm> +#include <functional> + #include "gtest/gtest.h" #include "absl/base/casts.h" +#include "absl/base/config.h" namespace absl { ABSL_NAMESPACE_BEGIN
diff --git a/absl/types/source_location.h b/absl/types/source_location.h index 6e14836..36e2d9e 100644 --- a/absl/types/source_location.h +++ b/absl/types/source_location.h
@@ -72,7 +72,8 @@ // C++17-compatible class representing a specific location in the source code of // a program. Similar to std::source_location, but with a few key differences // explained above. -class SourceLocation { +class + SourceLocation { struct PrivateTag { private: explicit PrivateTag() = default; @@ -110,7 +111,8 @@ // } static constexpr SourceLocation current( PrivateTag = PrivateTag{}, std::uint_least32_t line = __builtin_LINE(), - const char* absl_nonnull file_name = __builtin_FILE()) { + const char* + absl_nonnull file_name = __builtin_FILE()) { return SourceLocation(line, file_name); } #else @@ -130,7 +132,8 @@ // The file name of the captured source location, or an unspecified string // if this information is not available. Guaranteed to never be NULL. - constexpr const char* absl_nonnull file_name() const noexcept { + constexpr const char* + absl_nonnull file_name() const noexcept { return file_name_; } @@ -146,8 +149,10 @@ private: // `file_name` must outlive all copies of the `absl::SourceLocation` object, // so in practice it should be a string literal. - constexpr SourceLocation(std::uint_least32_t line, - const char* absl_nonnull file_name) + constexpr SourceLocation( + std::uint_least32_t line, + const char* + absl_nonnull file_name) : line_(line), file_name_(file_name) {} // We would use [[maybe_unused]] here, but it doesn't work on all supported @@ -162,7 +167,8 @@ // type. std::uint_least32_t line_ = 0; std::uint_least32_t unused_column_ = 0; - const char* absl_nonnull file_name_ = ""; + const char* + absl_nonnull file_name_ = ""; }; ABSL_NAMESPACE_END
diff --git a/absl/types/span_test.cc b/absl/types/span_test.cc index 3cc9e3d..57cbb99 100644 --- a/absl/types/span_test.cc +++ b/absl/types/span_test.cc
@@ -14,7 +14,9 @@ #include "absl/types/span.h" +#include <algorithm> #include <array> +#include <cstddef> #include <initializer_list> #include <numeric> #include <stdexcept>