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>