Roll abseil_revision 2e36d96669..d2c5297a3c

Change Log:
https://chromium.googlesource.com/external/github.com/abseil/abseil-cpp/+log/2e36d96669..d2c5297a3c
Full diff:
https://chromium.googlesource.com/external/github.com/abseil/abseil-cpp/+/2e36d96669..d2c5297a3c

No .def changes

Bug: None
Change-Id: I46efa3b040abfd40b6daf6f55162166863e89142
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3709078
Reviewed-by: Mirko Bonadei <mbonadei@chromium.org>
Commit-Queue: Danil Chapovalov <danilchap@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1015877}
NOKEYCHECK=True
GitOrigin-RevId: 091826cb4e7e40a691c2e00c6e38c26682fbcacc
diff --git a/BUILD.gn b/BUILD.gn
index 9b9220a..d8b6501 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -72,6 +72,7 @@
     "//third_party/abseil-cpp/absl/debugging:failure_signal_handler",
     "//third_party/abseil-cpp/absl/debugging:stacktrace",
     "//third_party/abseil-cpp/absl/debugging:symbolize",
+    "//third_party/abseil-cpp/absl/functional:any_invocable",
     "//third_party/abseil-cpp/absl/functional:bind_front",
     "//third_party/abseil-cpp/absl/functional:function_ref",
     "//third_party/abseil-cpp/absl/hash",
@@ -191,6 +192,7 @@
         "absl/container:inlined_vector_test",
         "absl/container:node_slot_policy_test",
         "absl/container:sample_element_size_test",
+        "absl/functional:any_invocable_test",
         "absl/hash:hash_test",
         "absl/hash:low_level_hash_test",
         "absl/memory:memory_test",
@@ -199,6 +201,7 @@
         "absl/profiling:periodic_sampler_test",
         "absl/status:statusor_test",
         "absl/strings:ascii_test",
+        "absl/strings:cord_buffer_test",
         "absl/strings:cord_data_edge_test",
         "absl/strings:cord_rep_btree_navigator_test",
         "absl/strings:cord_rep_btree_reader_test",
@@ -207,7 +210,6 @@
         "absl/strings:cordz_functions_test",
         "absl/strings:cordz_info_statistics_test",
         "absl/strings:cordz_info_test",
-        "absl/strings:cord_buffer_test",
         "absl/strings:cordz_test",
         "absl/strings:cordz_update_scope_test",
         "absl/strings:cordz_update_tracker_test",
diff --git a/CMake/AbseilDll.cmake b/CMake/AbseilDll.cmake
index f81cb0a..00cddb8 100644
--- a/CMake/AbseilDll.cmake
+++ b/CMake/AbseilDll.cmake
@@ -109,9 +109,11 @@
   "debugging/internal/symbolize.h"
   "debugging/internal/vdso_support.cc"
   "debugging/internal/vdso_support.h"
+  "functional/any_invocable.h"
   "functional/internal/front_binder.h"
   "functional/bind_front.h"
   "functional/function_ref.h"
+  "functional/internal/any_invocable.h"
   "functional/internal/function_ref.h"
   "hash/hash.h"
   "hash/internal/city.h"
@@ -388,6 +390,7 @@
   "kernel_timeout_internal"
   "synchronization"
   "thread_pool"
+  "any_invocable"
   "bind_front"
   "function_ref"
   "atomic_hook"
diff --git a/README.chromium b/README.chromium
index 4680f42..898355f 100644
--- a/README.chromium
+++ b/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: 2e36d96669b0f56eaf865245c7bcf8060963a088
+Revision: d2c5297a3c3948de765100cb7e5cccca1210d23c
 Security Critical: yes
 
 Description:
diff --git a/WORKSPACE b/WORKSPACE
index 1a1753a..4469644 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -20,11 +20,21 @@
 
 # GoogleTest/GoogleMock framework. Used by most unit-tests.
 http_archive(
-    name = "com_google_googletest",  # 2022-01-28T15:27:11Z
-    sha256 = "eb70a6d4520f940956a6b3e37d205d92736bb104c6a1b2b9f82bfc41bd7a2b34",
-    strip_prefix = "googletest-28e1da21d8d677bc98f12ccc7fc159ff19e8e817",
+    name = "com_google_googletest",  # 2022-06-16T20:18:32Z
+    sha256 = "a1d3123179024258f9c399d45da3e0b09c4aaf8d2c041466ce5b4793a8929f23",
+    strip_prefix = "googletest-86add13493e5c881d7e4ba77fb91c1f57752b3a4",
     # Keep this URL in sync with ABSL_GOOGLETEST_COMMIT in ci/cmake_common.sh.
-    urls = ["https://github.com/google/googletest/archive/28e1da21d8d677bc98f12ccc7fc159ff19e8e817.zip"],
+    urls = ["https://github.com/google/googletest/archive/86add13493e5c881d7e4ba77fb91c1f57752b3a4.zip"],
+)
+
+# RE2 (the regular expression library used by GoogleTest)
+# Note this must use a commit from the `abseil` branch of the RE2 project.
+# https://github.com/google/re2/tree/abseil
+http_archive(
+    name = "com_googlesource_code_re2",  # 2022-04-08
+    sha256 = "906d0df8ff48f8d3a00a808827f009a840190f404559f649cb8e4d7143255ef9",
+    strip_prefix = "re2-a276a8c738735a0fe45a6ee590fe2df69bcf4502",
+    urls = ["https://github.com/google/re2/archive/a276a8c738735a0fe45a6ee590fe2df69bcf4502.zip"],
 )
 
 # Google benchmark.
diff --git a/absl/base/internal/direct_mmap.h b/absl/base/internal/direct_mmap.h
index a01d612..e492bb0 100644
--- a/absl/base/internal/direct_mmap.h
+++ b/absl/base/internal/direct_mmap.h
@@ -41,13 +41,13 @@
 
 #ifdef __mips__
 // Include definitions of the ABI currently in use.
-#ifdef __BIONIC__
+#if defined(__BIONIC__) || !defined(__GLIBC__)
 // Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the
 // definitions we need.
 #include <asm/sgidefs.h>
 #else
 #include <sgidefs.h>
-#endif  // __BIONIC__
+#endif  // __BIONIC__ || !__GLIBC__
 #endif  // __mips__
 
 // SYS_mmap and SYS_munmap are not defined in Android.
diff --git a/absl/base/internal/invoke.h b/absl/base/internal/invoke.h
index 018b1af..643c2a4 100644
--- a/absl/base/internal/invoke.h
+++ b/absl/base/internal/invoke.h
@@ -102,8 +102,18 @@
   static decltype((std::declval<Obj>().*
                    std::declval<MemFun>())(std::declval<Args>()...))
   Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) {
+// Ignore bogus GCC warnings on this line.
+// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101436 for similar example.
+#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Warray-bounds"
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
     return (std::forward<Obj>(obj).*
             std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
+#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
+#pragma GCC diagnostic pop
+#endif
   }
 };
 
diff --git a/absl/flags/CMakeLists.txt b/absl/flags/CMakeLists.txt
index 79e51a1..3e9d5ad 100644
--- a/absl/flags/CMakeLists.txt
+++ b/absl/flags/CMakeLists.txt
@@ -466,5 +466,5 @@
     absl::flags_reflection
     absl::flags_usage
     absl::strings
-    GTest::gtest
+    GTest::gmock
 )
diff --git a/absl/flags/internal/usage_test.cc b/absl/flags/internal/usage_test.cc
index 6a65a1a..209a7be 100644
--- a/absl/flags/internal/usage_test.cc
+++ b/absl/flags/internal/usage_test.cc
@@ -20,6 +20,7 @@
 #include <sstream>
 #include <string>
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/flags/flag.h"
 #include "absl/flags/internal/parse.h"
@@ -105,14 +106,19 @@
 using UsageReportingDeathTest = UsageReportingTest;
 
 TEST_F(UsageReportingDeathTest, TestSetProgramUsageMessage) {
+#if !defined(GTEST_HAS_ABSL) || !GTEST_HAS_ABSL
+  // Check for kTestUsageMessage set in main() below.
   EXPECT_EQ(absl::ProgramUsageMessage(), kTestUsageMessage);
+#else
+  // Check for part of the usage message set by GoogleTest.
+  EXPECT_THAT(absl::ProgramUsageMessage(),
+              ::testing::HasSubstr(
+                  "This program contains tests written using Google Test"));
+#endif
 
-#ifndef _WIN32
-  // TODO(rogeeff): figure out why this does not work on Windows.
   EXPECT_DEATH_IF_SUPPORTED(
       absl::SetProgramUsageMessage("custom usage message"),
-      ".*SetProgramUsageMessage\\(\\) called twice.*");
-#endif
+      ::testing::HasSubstr("SetProgramUsageMessage() called twice"));
 }
 
 // --------------------------------------------------------------------
@@ -489,8 +495,10 @@
 int main(int argc, char* argv[]) {
   (void)absl::GetFlag(FLAGS_undefok);  // Force linking of parse.cc
   flags::SetProgramInvocationName("usage_test");
+#if !defined(GTEST_HAS_ABSL) || !GTEST_HAS_ABSL
+  // GoogleTest calls absl::SetProgramUsageMessage() already.
   absl::SetProgramUsageMessage(kTestUsageMessage);
+#endif
   ::testing::InitGoogleTest(&argc, argv);
-
   return RUN_ALL_TESTS();
 }
diff --git a/absl/functional/BUILD.bazel b/absl/functional/BUILD.bazel
index dbfa81f..c4fbce9 100644
--- a/absl/functional/BUILD.bazel
+++ b/absl/functional/BUILD.bazel
@@ -26,6 +26,40 @@
 licenses(["notice"])
 
 cc_library(
+    name = "any_invocable",
+    srcs = ["internal/any_invocable.h"],
+    hdrs = ["any_invocable.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        "//absl/base:base_internal",
+        "//absl/base:config",
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/utility",
+    ],
+)
+
+cc_test(
+    name = "any_invocable_test",
+    srcs = [
+        "any_invocable_test.cc",
+        "internal/any_invocable.h",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":any_invocable",
+        "//absl/base:base_internal",
+        "//absl/base:config",
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+        "//absl/utility",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_library(
     name = "bind_front",
     srcs = ["internal/front_binder.h"],
     hdrs = ["bind_front.h"],
@@ -86,6 +120,7 @@
     tags = ["benchmark"],
     visibility = ["//visibility:private"],
     deps = [
+        ":any_invocable",
         ":function_ref",
         "//absl/base:core_headers",
         "@com_github_google_benchmark//:benchmark_main",
diff --git a/absl/functional/BUILD.gn b/absl/functional/BUILD.gn
index 64dadde..21cd6ae 100644
--- a/absl/functional/BUILD.gn
+++ b/absl/functional/BUILD.gn
@@ -4,6 +4,36 @@
 
 import("//third_party/abseil-cpp/absl.gni")
 
+absl_source_set("any_invocable") {
+  sources = [ "internal/any_invocable.h" ]
+  public = [ "any_invocable.h" ]
+  deps = [
+    "//third_party/abseil-cpp/absl/base:base_internal",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/abseil-cpp/absl/utility",
+  ]
+}
+
+absl_source_set("any_invocable_test") {
+  testonly = true
+  sources = [
+    "any_invocable_test.cc",
+    "internal/any_invocable.h",
+  ]
+  deps = [
+    ":any_invocable",
+    "//third_party/abseil-cpp/absl/base:base_internal",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/meta:type_traits",
+    "//third_party/abseil-cpp/absl/utility",
+    "//third_party/googletest:gmock",
+    "//third_party/googletest:gtest",
+  ]
+}
+
 absl_source_set("bind_front") {
   sources = [ "internal/front_binder.h" ]
   public = [ "bind_front.h" ]
diff --git a/absl/functional/CMakeLists.txt b/absl/functional/CMakeLists.txt
index 338ddc6..c0f6eaa 100644
--- a/absl/functional/CMakeLists.txt
+++ b/absl/functional/CMakeLists.txt
@@ -16,6 +16,42 @@
 
 absl_cc_library(
   NAME
+    any_invocable
+  SRCS
+    "internal/any_invocable.h"
+  HDRS
+    "any_invocable.h"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::base_internal
+    absl::config
+    absl::core_headers
+    absl::type_traits
+    absl::utility
+  PUBLIC
+)
+
+absl_cc_test(
+  NAME
+    any_invocable_test
+  SRCS
+    "any_invocable_test.cc"
+    "internal/any_invocable.h"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::any_invocable
+    absl::base_internal
+    absl::config
+    absl::core_headers
+    absl::type_traits
+    absl::utility
+    GTest::gmock_main
+)
+
+absl_cc_library(
+  NAME
     bind_front
   SRCS
     "internal/front_binder.h"
diff --git a/absl/functional/any_invocable.h b/absl/functional/any_invocable.h
new file mode 100644
index 0000000..0c5faca
--- /dev/null
+++ b/absl/functional/any_invocable.h
@@ -0,0 +1,313 @@
+// Copyright 2022 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// File: any_invocable.h
+// -----------------------------------------------------------------------------
+//
+// This header file defines an `absl::AnyInvocable` type that assumes ownership
+// and wraps an object of an invocable type. (Invocable types adhere to the
+// concept specified in https://en.cppreference.com/w/cpp/concepts/invocable.)
+//
+// In general, prefer `absl::AnyInvocable` when you need a type-erased
+// function parameter that needs to take ownership of the type.
+//
+// NOTE: `absl::AnyInvocable` is similar to the C++23 `std::move_only_function`
+// abstraction, but has a slightly different API and is not designed to be a
+// drop-in replacement or C++11-compatible backfill of that type.
+
+#ifndef ABSL_FUNCTIONAL_ANY_INVOCABLE_H_
+#define ABSL_FUNCTIONAL_ANY_INVOCABLE_H_
+
+#include <cstddef>
+#include <initializer_list>
+#include <type_traits>
+#include <utility>
+
+#include "absl/base/config.h"
+#include "absl/functional/internal/any_invocable.h"
+#include "absl/meta/type_traits.h"
+#include "absl/utility/utility.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+
+// absl::AnyInvocable
+//
+// `absl::AnyInvocable` is a functional wrapper type, like `std::function`, that
+// assumes ownership of an invocable object. Unlike `std::function`, an
+// `absl::AnyInvocable` is more type-safe and provides the following additional
+// benefits:
+//
+// * Properly adheres to const correctness of the underlying type
+// * Is move-only so avoids concurrency problems with copied invocables and
+//   unnecessary copies in general.
+// * Supports reference qualifiers allowing it to perform unique actions (noted
+//   below).
+//
+// `absl::AnyInvocable` is a template, and an `absl::AnyInvocable` instantiation
+// may wrap any invocable object with a compatible function signature, e.g.
+// having arguments and return types convertible to types matching the
+// `absl::AnyInvocable` signature, and also matching any stated reference
+// qualifiers, as long as that type is moveable. It therefore provides broad
+// type erasure for functional objects.
+//
+// An `absl::AnyInvocable` is typically used as a type-erased function parameter
+// for accepting various functional objects:
+//
+// // Define a function taking an AnyInvocable parameter.
+// void my_func(absl::AnyInvocable<int()> f) {
+//   ...
+// };
+//
+// // That function can accept any invocable type:
+//
+// // Accept a function reference. We don't need to move a reference.
+// int func1() { return 0; };
+// my_func(func1);
+//
+// // Accept a lambda. We use std::move here because otherwise my_func would
+// // copy the lambda.
+// auto lambda = []() { return 0; };
+// my_func(std::move(lambda));
+//
+// // Accept a function pointer. We don't need to move a function pointer.
+// func2 = &func1;
+// my_func(func2);
+//
+// // Accept an std::function by moving it. Note that the lambda is copyable
+// // (satisfying std::function requirements) and moveable (satisfying
+// // absl::AnyInvocable requirements).
+// std::function<int()> func6 = []() { return 0; };
+// my_func(std::move(func6));
+//
+// `AnyInvocable` also properly respects `const` qualifiers, reference
+// qualifiers, and the `noexcept` specification (only in C++ 17 and beyond) as
+// part of the user-specified function type (e.g.
+// `AnyInvocable<void()&& const noexcept>`). These qualifiers will be applied to
+// the `AnyInvocable` object's `operator()`, and the underlying invocable must
+// be compatible with those qualifiers.
+//
+// Comparison of const and non-const function types:
+//
+//   // Store a closure inside of `func` with the function type `int()`.
+//   // Note that we have made `func` itself `const`.
+//   const AnyInvocable<int()> func = [](){ return 0; };
+//
+//   func();  // Compile-error: the passed type `int()` isn't `const`.
+//
+//   // Store a closure inside of `const_func` with the function type
+//   // `int() const`.
+//   // Note that we have also made `const_func` itself `const`.
+//   const AnyInvocable<int() const> const_func = [](){ return 0; };
+//
+//   const_func();  // Fine: `int() const` is `const`.
+//
+// In the above example, the call `func()` would have compiled if
+// `std::function` were used even though the types are not const compatible.
+// This is a bug, and using `absl::AnyInvocable` properly detects that bug.
+//
+// In addition to affecting the signature of `operator()`, the `const` and
+// reference qualifiers of the function type also appropriately constrain which
+// kinds of invocable objects you are allowed to place into the `AnyInvocable`
+// instance. If you specify a function type that is const-qualified, then
+// anything that you attempt to put into the `AnyInvocable` must be callable on
+// a `const` instance of that type.
+//
+// Constraint example:
+//
+//   // Fine because the lambda is callable when `const`.
+//   AnyInvocable<int() const> func = [=](){ return 0; };
+//
+//   // This is a compile-error because the lambda isn't callable when `const`.
+//   AnyInvocable<int() const> error = [=]() mutable { return 0; };
+//
+// An `&&` qualifier can be used to express that an `absl::AnyInvocable`
+// instance should be invoked at most once:
+//
+//   // Invokes `continuation` with the logical result of an operation when
+//   // that operation completes (common in asynchronous code).
+//   void CallOnCompletion(AnyInvocable<void(int)&&> continuation) {
+//     int result_of_foo = foo();
+//
+//     // `std::move` is required because the `operator()` of `continuation` is
+//     // rvalue-reference qualified.
+//     std::move(continuation)(result_of_foo);
+//   }
+//
+// Credits to Matt Calabrese (https://github.com/mattcalabrese) for the original
+// implementation.
+template <class Sig>
+class AnyInvocable : private internal_any_invocable::Impl<Sig> {
+ private:
+  static_assert(
+      std::is_function<Sig>::value,
+      "The template argument of AnyInvocable must be a function type.");
+
+  using Impl = internal_any_invocable::Impl<Sig>;
+
+ public:
+  // The return type of Sig
+  using result_type = typename Impl::result_type;
+
+  // Constructors
+
+  // Constructs the `AnyInvocable` in an empty state.
+  AnyInvocable() noexcept = default;
+  AnyInvocable(std::nullptr_t) noexcept {}  // NOLINT
+
+  // Constructs the `AnyInvocable` from an existing `AnyInvocable` by a move.
+  // Note that `f` is not guaranteed to be empty after move-construction,
+  // although it may be.
+  AnyInvocable(AnyInvocable&& /*f*/) noexcept = default;
+
+  // Constructs an `AnyInvocable` from an invocable object.
+  //
+  // Upon construction, `*this` is only empty if `f` is a function pointer or
+  // member pointer type and is null, or if `f` is an `AnyInvocable` that is
+  // empty.
+  template <class F, typename = absl::enable_if_t<
+                         internal_any_invocable::CanConvert<Sig, F>::value>>
+  AnyInvocable(F&& f)  // NOLINT
+      : Impl(internal_any_invocable::ConversionConstruct(),
+             std::forward<F>(f)) {}
+
+  // Constructs an `AnyInvocable` that holds an invocable object of type `T`,
+  // which is constructed in-place from the given arguments.
+  //
+  // Example:
+  //
+  //   AnyInvocable<int(int)> func(
+  //       absl::in_place_type<PossiblyImmovableType>, arg1, arg2);
+  //
+  template <class T, class... Args,
+            typename = absl::enable_if_t<
+                internal_any_invocable::CanEmplace<Sig, T, Args...>::value>>
+  explicit AnyInvocable(absl::in_place_type_t<T>, Args&&... args)
+      : Impl(absl::in_place_type<absl::decay_t<T>>,
+             std::forward<Args>(args)...) {
+    static_assert(std::is_same<T, absl::decay_t<T>>::value,
+                  "The explicit template argument of in_place_type is required "
+                  "to be an unqualified object type.");
+  }
+
+  // Overload of the above constructor to support list-initialization.
+  template <class T, class U, class... Args,
+            typename = absl::enable_if_t<internal_any_invocable::CanEmplace<
+                Sig, T, std::initializer_list<U>&, Args...>::value>>
+  explicit AnyInvocable(absl::in_place_type_t<T>,
+                        std::initializer_list<U> ilist, Args&&... args)
+      : Impl(absl::in_place_type<absl::decay_t<T>>, ilist,
+             std::forward<Args>(args)...) {
+    static_assert(std::is_same<T, absl::decay_t<T>>::value,
+                  "The explicit template argument of in_place_type is required "
+                  "to be an unqualified object type.");
+  }
+
+  // Assignment Operators
+
+  // Assigns an `AnyInvocable` through move-assignment.
+  // Note that `f` is not guaranteed to be empty after move-assignment
+  // although it may be.
+  AnyInvocable& operator=(AnyInvocable&& /*f*/) noexcept = default;
+
+  // Assigns an `AnyInvocable` from a nullptr, clearing the `AnyInvocable`. If
+  // not empty, destroys the target, putting `*this` into an empty state.
+  AnyInvocable& operator=(std::nullptr_t) noexcept {
+    this->Clear();
+    return *this;
+  }
+
+  // Assigns an `AnyInvocable` from an existing `AnyInvocable` instance.
+  //
+  // Upon assignment, `*this` is only empty if `f` is a function pointer or
+  // member pointer type and is null, or if `f` is an `AnyInvocable` that is
+  // empty.
+  template <class F, typename = absl::enable_if_t<
+                         internal_any_invocable::CanAssign<Sig, F>::value>>
+  AnyInvocable& operator=(F&& f) {
+    *this = AnyInvocable(std::forward<F>(f));
+    return *this;
+  }
+
+  // Assigns an `AnyInvocable` from a reference to an invocable object.
+  // Upon assignment, stores a reference to the invocable object in the
+  // `AnyInvocable` instance.
+  template <
+      class F,
+      typename = absl::enable_if_t<
+          internal_any_invocable::CanAssignReferenceWrapper<Sig, F>::value>>
+  AnyInvocable& operator=(std::reference_wrapper<F> f) noexcept {
+    *this = AnyInvocable(f);
+    return *this;
+  }
+
+  // Destructor
+
+  // If not empty, destroys the target.
+  ~AnyInvocable() = default;
+
+  // absl::AnyInvocable::swap()
+  //
+  // Exchanges the targets of `*this` and `other`.
+  void swap(AnyInvocable& other) noexcept { std::swap(*this, other); }
+
+  // abl::AnyInvocable::operator bool()
+  //
+  // Returns `true` if `*this` is not empty.
+  explicit operator bool() const noexcept { return this->HasValue(); }
+
+  // Invokes the target object of `*this`. `*this` must not be empty.
+  //
+  // Note: The signature of this function call operator is the same as the
+  //       template parameter `Sig`.
+  using Impl::operator();
+
+  // Equality operators
+
+  // Returns `true` if `*this` is empty.
+  friend bool operator==(const AnyInvocable& f, std::nullptr_t) noexcept {
+    return !f.HasValue();
+  }
+
+  // Returns `true` if `*this` is empty.
+  friend bool operator==(std::nullptr_t, const AnyInvocable& f) noexcept {
+    return !f.HasValue();
+  }
+
+  // Returns `false` if `*this` is empty.
+  friend bool operator!=(const AnyInvocable& f, std::nullptr_t) noexcept {
+    return f.HasValue();
+  }
+
+  // Returns `false` if `*this` is empty.
+  friend bool operator!=(std::nullptr_t, const AnyInvocable& f) noexcept {
+    return f.HasValue();
+  }
+
+  // swap()
+  //
+  // Exchanges the targets of `f1` and `f2`.
+  friend void swap(AnyInvocable& f1, AnyInvocable& f2) noexcept { f1.swap(f2); }
+
+ private:
+  // Friending other instantiations is necessary for conversions.
+  template <bool /*SigIsNoexcept*/, class /*ReturnType*/, class... /*P*/>
+  friend class internal_any_invocable::CoreImpl;
+};
+
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_FUNCTIONAL_ANY_INVOCABLE_H_
diff --git a/absl/functional/any_invocable_test.cc b/absl/functional/any_invocable_test.cc
new file mode 100644
index 0000000..fb5e779
--- /dev/null
+++ b/absl/functional/any_invocable_test.cc
@@ -0,0 +1,1696 @@
+// Copyright 2022 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/functional/any_invocable.h"
+
+#include <cstddef>
+#include <initializer_list>
+#include <numeric>
+#include <type_traits>
+
+#include "gtest/gtest.h"
+#include "absl/base/config.h"
+#include "absl/meta/type_traits.h"
+#include "absl/utility/utility.h"
+
+static_assert(absl::internal_any_invocable::kStorageSize >= sizeof(void*),
+              "These tests assume that the small object storage is at least "
+              "the size of a pointer.");
+
+namespace {
+
+// Helper macro used to avoid spelling `noexcept` in language versions older
+// than C++17, where it is not part of the type system, in order to avoid
+// compilation failures and internal compiler errors.
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) noexcept(noex)
+#else
+#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex)
+#endif
+
+// A dummy type we use when passing qualifiers to metafunctions
+struct _ {};
+
+template <class T>
+struct Wrapper {
+  template <class U,
+            class = absl::enable_if_t<std::is_convertible<U, T>::value>>
+  Wrapper(U&&);  // NOLINT
+};
+
+// This will cause a recursive trait instantiation if the SFINAE checks are
+// not ordered correctly for constructibility.
+static_assert(std::is_constructible<Wrapper<absl::AnyInvocable<void()>>,
+                                    Wrapper<absl::AnyInvocable<void()>>>::value,
+              "");
+
+// A metafunction that takes the cv and l-value reference qualifiers that were
+// associated with a function type (here passed via qualifiers of an object
+// type), and .
+template <class Qualifiers, class This>
+struct QualifiersForThisImpl {
+  static_assert(std::is_object<This>::value, "");
+  using type =
+      absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&;
+};
+
+template <class Qualifiers, class This>
+struct QualifiersForThisImpl<Qualifiers&, This>
+    : QualifiersForThisImpl<Qualifiers, This> {};
+
+template <class Qualifiers, class This>
+struct QualifiersForThisImpl<Qualifiers&&, This> {
+  static_assert(std::is_object<This>::value, "");
+  using type =
+      absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&&;
+};
+
+template <class Qualifiers, class This>
+using QualifiersForThis =
+    typename QualifiersForThisImpl<Qualifiers, This>::type;
+
+// A metafunction that takes the cv and l-value reference qualifier of T and
+// applies them to U's function type qualifiers.
+template <class T, class Fun>
+struct GiveQualifiersToFunImpl;
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T, R(P...)> {
+  using type =
+      absl::conditional_t<std::is_const<T>::value, R(P...) const, R(P...)>;
+};
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T&, R(P...)> {
+  using type =
+      absl::conditional_t<std::is_const<T>::value, R(P...) const&, R(P...)&>;
+};
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T&&, R(P...)> {
+  using type =
+      absl::conditional_t<std::is_const<T>::value, R(P...) const&&, R(P...) &&>;
+};
+
+// If noexcept is a part of the type system, then provide the noexcept forms.
+#if defined(__cpp_noexcept_function_type)
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T, R(P...) noexcept> {
+  using type = absl::conditional_t<std::is_const<T>::value,
+                                   R(P...) const noexcept, R(P...) noexcept>;
+};
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T&, R(P...) noexcept> {
+  using type =
+      absl::conditional_t<std::is_const<T>::value, R(P...) const & noexcept,
+                          R(P...) & noexcept>;
+};
+
+template <class T, class R, class... P>
+struct GiveQualifiersToFunImpl<T&&, R(P...) noexcept> {
+  using type =
+      absl::conditional_t<std::is_const<T>::value, R(P...) const && noexcept,
+                          R(P...) && noexcept>;
+};
+
+#endif  // defined(__cpp_noexcept_function_type)
+
+template <class T, class Fun>
+using GiveQualifiersToFun = typename GiveQualifiersToFunImpl<T, Fun>::type;
+
+// This is used in template parameters to decide whether or not to use a type
+// that fits in the small object optimization storage.
+enum class ObjSize { small, large };
+
+// A base type that is used with classes as a means to insert an
+// appropriately-sized dummy datamember when Size is ObjSize::large so that the
+// user's class type is guaranteed to not fit in small object storage.
+template <ObjSize Size>
+struct TypeErasedPadding;
+
+template <>
+struct TypeErasedPadding<ObjSize::small> {};
+
+template <>
+struct TypeErasedPadding<ObjSize::large> {
+  char dummy_data[absl::internal_any_invocable::kStorageSize + 1] = {};
+};
+
+struct Int {
+  Int(int v) noexcept : value(v) {}  // NOLINT
+#ifndef _MSC_VER
+  Int(Int&&) noexcept {
+    // NOTE: Prior to C++17, this not being called requires optimizations to
+    //       take place when performing the top-level invocation. In practice,
+    //       most supported compilers perform this optimization prior to C++17.
+    std::abort();
+  }
+#else
+  Int(Int&& v) noexcept = default;
+#endif
+  operator int() && noexcept { return value; }  // NOLINT
+
+  int MemberFunctionAdd(int const& b, int c) noexcept {  // NOLINT
+    return value + b + c;
+  }
+
+  int value;
+};
+
+enum class Movable { no, yes, nothrow, trivial };
+
+enum class NothrowCall { no, yes };
+
+enum class Destructible { nothrow, trivial };
+
+enum class ObjAlign : std::size_t {
+  normal = absl::internal_any_invocable::kAlignment,
+  large = absl::internal_any_invocable::kAlignment * 2,
+};
+
+// A function-object template that has knobs for each property that can affect
+// how the object is stored in AnyInvocable.
+template <Movable Movability, Destructible Destructibility, class Qual,
+          NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
+struct add;
+
+#define ABSL_INTERNALS_ADD(qual)                                              \
+  template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>  \
+  struct alignas(static_cast<std::size_t>(Alignment))                         \
+      add<Movable::trivial, Destructible::trivial, _ qual, CallExceptionSpec, \
+          Size, Alignment> : TypeErasedPadding<Size> {                        \
+    explicit add(int state_init) : state(state_init) {}                       \
+    explicit add(std::initializer_list<int> state_init, int tail)             \
+        : state(std::accumulate(std::begin(state_init), std::end(state_init), \
+                                0) +                                          \
+                tail) {}                                                      \
+    add(add&& other) = default; /*NOLINT*/                                    \
+    Int operator()(int a, int b, int c) qual                                  \
+        ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) {  \
+      return state + a + b + c;                                               \
+    }                                                                         \
+    int state;                                                                \
+  };                                                                          \
+                                                                              \
+  template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>  \
+  struct alignas(static_cast<std::size_t>(Alignment))                         \
+      add<Movable::trivial, Destructible::nothrow, _ qual, CallExceptionSpec, \
+          Size, Alignment> : TypeErasedPadding<Size> {                        \
+    explicit add(int state_init) : state(state_init) {}                       \
+    explicit add(std::initializer_list<int> state_init, int tail)             \
+        : state(std::accumulate(std::begin(state_init), std::end(state_init), \
+                                0) +                                          \
+                tail) {}                                                      \
+    ~add() noexcept {}                                                        \
+    add(add&& other) = default; /*NOLINT*/                                    \
+    Int operator()(int a, int b, int c) qual                                  \
+        ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) {  \
+      return state + a + b + c;                                               \
+    }                                                                         \
+    int state;                                                                \
+  }
+
+// Explicitly specify an empty argument.
+// MSVC (at least up to _MSC_VER 1931, if not beyond) warns that
+// ABSL_INTERNALS_ADD() is an undefined zero-arg overload.
+#define ABSL_INTERNALS_NOARG
+ABSL_INTERNALS_ADD(ABSL_INTERNALS_NOARG);
+#undef ABSL_INTERNALS_NOARG
+
+ABSL_INTERNALS_ADD(const);
+ABSL_INTERNALS_ADD(&);
+ABSL_INTERNALS_ADD(const&);
+ABSL_INTERNALS_ADD(&&);       // NOLINT
+ABSL_INTERNALS_ADD(const&&);  // NOLINT
+
+#undef ABSL_INTERNALS_ADD
+
+template <Destructible Destructibility, class Qual,
+          NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
+struct add<Movable::no, Destructibility, Qual, CallExceptionSpec, Size,
+           Alignment> : private add<Movable::trivial, Destructibility, Qual,
+                                    CallExceptionSpec, Size, Alignment> {
+  using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
+                   Size, Alignment>;
+
+  explicit add(int state_init) : Base(state_init) {}
+
+  explicit add(std::initializer_list<int> state_init, int tail)
+      : Base(state_init, tail) {}
+
+  add(add&&) = delete;
+
+  using Base::operator();
+  using Base::state;
+};
+
+template <Destructible Destructibility, class Qual,
+          NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
+struct add<Movable::yes, Destructibility, Qual, CallExceptionSpec, Size,
+           Alignment> : private add<Movable::trivial, Destructibility, Qual,
+                                    CallExceptionSpec, Size, Alignment> {
+  using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
+                   Size, Alignment>;
+
+  explicit add(int state_init) : Base(state_init) {}
+
+  explicit add(std::initializer_list<int> state_init, int tail)
+      : Base(state_init, tail) {}
+
+  add(add&& other) noexcept(false) : Base(other.state) {}  // NOLINT
+
+  using Base::operator();
+  using Base::state;
+};
+
+template <Destructible Destructibility, class Qual,
+          NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
+struct add<Movable::nothrow, Destructibility, Qual, CallExceptionSpec, Size,
+           Alignment> : private add<Movable::trivial, Destructibility, Qual,
+                                    CallExceptionSpec, Size, Alignment> {
+  using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
+                   Size, Alignment>;
+
+  explicit add(int state_init) : Base(state_init) {}
+
+  explicit add(std::initializer_list<int> state_init, int tail)
+      : Base(state_init, tail) {}
+
+  add(add&& other) noexcept : Base(other.state) {}
+
+  using Base::operator();
+  using Base::state;
+};
+
+// Actual non-member functions rather than function objects
+Int add_function(Int&& a, int b, int c) noexcept { return a.value + b + c; }
+
+Int mult_function(Int&& a, int b, int c) noexcept { return a.value * b * c; }
+
+Int square_function(Int const&& a) noexcept { return a.value * a.value; }
+
+template <class Sig>
+using AnyInvocable = absl::AnyInvocable<Sig>;
+
+// Instantiations of this template contains all of the compile-time parameters
+// for a given instantiation of the AnyInvocable test suite.
+template <Movable Movability, Destructible Destructibility, class Qual,
+          NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
+struct TestParams {
+  static constexpr Movable kMovability = Movability;
+  static constexpr Destructible kDestructibility = Destructibility;
+  using Qualifiers = Qual;
+  static constexpr NothrowCall kCallExceptionSpec = CallExceptionSpec;
+  static constexpr bool kIsNoexcept = kCallExceptionSpec == NothrowCall::yes;
+  static constexpr bool kIsRvalueQualified =
+      std::is_rvalue_reference<Qual>::value;
+  static constexpr ObjSize kSize = Size;
+  static constexpr ObjAlign kAlignment = Alignment;
+
+  // These types are used when testing with member object pointer Invocables
+  using UnqualifiedUnaryFunType = int(Int const&&)
+      ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes);
+  using UnaryFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedUnaryFunType>;
+  using MemObjPtrType = int(Int::*);
+  using UnaryAnyInvType = AnyInvocable<UnaryFunType>;
+  using UnaryThisParamType = QualifiersForThis<Qualifiers, UnaryAnyInvType>;
+
+  template <class T>
+  static UnaryThisParamType ToUnaryThisParam(T&& fun) {
+    return static_cast<UnaryThisParamType>(fun);
+  }
+
+  // This function type intentionally uses 3 "kinds" of parameter types.
+  //     - A user-defined type
+  //     - A reference type
+  //     - A scalar type
+  //
+  // These were chosen because internal forwarding takes place on parameters
+  // differently depending based on type properties (scalars are forwarded by
+  // value).
+  using ResultType = Int;
+  using AnyInvocableFunTypeNotNoexcept = Int(Int, const int&, int);
+  using UnqualifiedFunType =
+      typename std::conditional<kIsNoexcept, Int(Int, const int&, int) noexcept,
+                                Int(Int, const int&, int)>::type;
+  using FunType = GiveQualifiersToFun<Qualifiers, UnqualifiedFunType>;
+  using MemFunPtrType =
+      typename std::conditional<kIsNoexcept,
+                                Int (Int::*)(const int&, int) noexcept,
+                                Int (Int::*)(const int&, int)>::type;
+  using AnyInvType = AnyInvocable<FunType>;
+  using AddType = add<kMovability, kDestructibility, Qualifiers,
+                      kCallExceptionSpec, kSize, kAlignment>;
+  using ThisParamType = QualifiersForThis<Qualifiers, AnyInvType>;
+
+  template <class T>
+  static ThisParamType ToThisParam(T&& fun) {
+    return static_cast<ThisParamType>(fun);
+  }
+
+  // These typedefs are used when testing void return type covariance.
+  using UnqualifiedVoidFunType =
+      typename std::conditional<kIsNoexcept,
+                                void(Int, const int&, int) noexcept,
+                                void(Int, const int&, int)>::type;
+  using VoidFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedVoidFunType>;
+  using VoidAnyInvType = AnyInvocable<VoidFunType>;
+  using VoidThisParamType = QualifiersForThis<Qualifiers, VoidAnyInvType>;
+
+  template <class T>
+  static VoidThisParamType ToVoidThisParam(T&& fun) {
+    return static_cast<VoidThisParamType>(fun);
+  }
+
+  using CompatibleAnyInvocableFunType =
+      absl::conditional_t<std::is_rvalue_reference<Qual>::value,
+                          GiveQualifiersToFun<const _&&, UnqualifiedFunType>,
+                          GiveQualifiersToFun<const _&, UnqualifiedFunType>>;
+
+  using CompatibleAnyInvType = AnyInvocable<CompatibleAnyInvocableFunType>;
+
+  using IncompatibleInvocable =
+      absl::conditional_t<std::is_rvalue_reference<Qual>::value,
+                          GiveQualifiersToFun<_&, UnqualifiedFunType>(_::*),
+                          GiveQualifiersToFun<_&&, UnqualifiedFunType>(_::*)>;
+};
+
+// Given a member-pointer type, this metafunction yields the target type of the
+// pointer, not including the class-type. It is used to verify that the function
+// call operator of AnyInvocable has the proper signature, corresponding to the
+// function type that the user provided.
+template <class MemberPtrType>
+struct MemberTypeOfImpl;
+
+template <class Class, class T>
+struct MemberTypeOfImpl<T(Class::*)> {
+  using type = T;
+};
+
+template <class MemberPtrType>
+using MemberTypeOf = typename MemberTypeOfImpl<MemberPtrType>::type;
+
+template <class T, class = void>
+struct IsMemberSwappableImpl : std::false_type {
+  static constexpr bool kIsNothrow = false;
+};
+
+template <class T>
+struct IsMemberSwappableImpl<
+    T, absl::void_t<decltype(std::declval<T&>().swap(std::declval<T&>()))>>
+    : std::true_type {
+  static constexpr bool kIsNothrow =
+      noexcept(std::declval<T&>().swap(std::declval<T&>()));
+};
+
+template <class T>
+using IsMemberSwappable = IsMemberSwappableImpl<T>;
+
+template <class T>
+using IsNothrowMemberSwappable =
+    std::integral_constant<bool, IsMemberSwappableImpl<T>::kIsNothrow>;
+
+template <class T>
+class AnyInvTestBasic : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestBasic);
+
+TYPED_TEST_P(AnyInvTestBasic, DefaultConstruction) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+
+  EXPECT_TRUE(std::is_nothrow_default_constructible<AnyInvType>::value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionNullptr) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = nullptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+
+  EXPECT_TRUE(
+      (std::is_nothrow_constructible<AnyInvType, std::nullptr_t>::value));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionNullFunctionPtr) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
+
+  UnqualifiedFunType* const null_fun_ptr = nullptr;
+  AnyInvType fun = null_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberFunctionPtr) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using MemFunPtrType = typename TypeParam::MemFunPtrType;
+
+  const MemFunPtrType null_mem_fun_ptr = nullptr;
+  AnyInvType fun = null_mem_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberObjectPtr) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+  using MemObjPtrType = typename TypeParam::MemObjPtrType;
+
+  const MemObjPtrType null_mem_obj_ptr = nullptr;
+  UnaryAnyInvType fun = null_mem_obj_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberFunctionPtr) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = &Int::MemberFunctionAdd;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberObjectPtr) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+
+  UnaryAnyInvType fun = &Int::value;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionFunctionReferenceDecay) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = add_function;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableEmpty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other;
+  AnyInvType fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+  EXPECT_EQ(other, nullptr);               // NOLINT
+  EXPECT_EQ(nullptr, other);               // NOLINT
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableNonempty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other = &add_function;
+  AnyInvType fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+  EXPECT_EQ(other, nullptr);               // NOLINT
+  EXPECT_EQ(nullptr, other);               // NOLINT
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ConversionToBool) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  {
+    AnyInvType fun;
+
+    // This tests contextually-convertible-to-bool.
+    EXPECT_FALSE(fun ? true : false);  // NOLINT
+
+    // Make sure that the conversion is not implicit.
+    EXPECT_TRUE(
+        (std::is_nothrow_constructible<bool, const AnyInvType&>::value));
+    EXPECT_FALSE((std::is_convertible<const AnyInvType&, bool>::value));
+  }
+
+  {
+    AnyInvType fun = &add_function;
+
+    // This tests contextually-convertible-to-bool.
+    EXPECT_TRUE(fun ? true : false);  // NOLINT
+  }
+}
+
+TYPED_TEST_P(AnyInvTestBasic, Invocation) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  using FunType = typename TypeParam::FunType;
+  using AnyInvCallType = MemberTypeOf<decltype(&AnyInvType::operator())>;
+
+  // Make sure the function call operator of AnyInvocable always has the
+  // type that was specified via the template argument.
+  EXPECT_TRUE((std::is_same<AnyInvCallType, FunType>::value));
+
+  AnyInvType fun = &add_function;
+
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceConstruction) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun(absl::in_place_type<AddType>, 5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceConstructionInitializerList) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun(absl::in_place_type<AddType>, {1, 2, 3, 4}, 5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(39, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstruction) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
+
+  AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>, nullptr);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstructionValueInit) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
+
+  AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstruction) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using MemFunPtrType = typename TypeParam::MemFunPtrType;
+
+  AnyInvType fun(absl::in_place_type<MemFunPtrType>, nullptr);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstructionValueInit) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using MemFunPtrType = typename TypeParam::MemFunPtrType;
+
+  AnyInvType fun(absl::in_place_type<MemFunPtrType>);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstruction) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+  using MemObjPtrType = typename TypeParam::MemObjPtrType;
+
+  UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>, nullptr);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstructionValueInit) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+  using MemObjPtrType = typename TypeParam::MemObjPtrType;
+
+  UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>);
+
+  // In-place construction does not lead to empty.
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, InPlaceVoidCovarianceConstruction) {
+  using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  VoidAnyInvType fun(absl::in_place_type<AddType>, 5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromEmpty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType source_fun;
+  AnyInvType fun(std::move(source_fun));
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+
+  EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromNonEmpty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType source_fun(absl::in_place_type<AddType>, 5);
+  AnyInvType fun(std::move(source_fun));
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrEmpty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun;
+
+  EXPECT_TRUE(fun == nullptr);
+  EXPECT_TRUE(nullptr == fun);
+
+  EXPECT_FALSE(fun != nullptr);
+  EXPECT_FALSE(nullptr != fun);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrNonempty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun(absl::in_place_type<AddType>, 5);
+
+  EXPECT_FALSE(fun == nullptr);
+  EXPECT_FALSE(nullptr == fun);
+
+  EXPECT_TRUE(fun != nullptr);
+  EXPECT_TRUE(nullptr != fun);
+}
+
+TYPED_TEST_P(AnyInvTestBasic, ResultType) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using ExpectedResultType = typename TypeParam::ResultType;
+
+  EXPECT_TRUE((std::is_same<typename AnyInvType::result_type,
+                            ExpectedResultType>::value));
+}
+
+template <class T>
+class AnyInvTestCombinatoric : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestCombinatoric);
+
+TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType source_fun;
+  AnyInvType fun;
+
+  fun = std::move(source_fun);
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType source_fun(absl::in_place_type<AddType>, 5);
+  AnyInvType fun;
+
+  fun = std::move(source_fun);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyEmptyLhsRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType source_fun;
+  AnyInvType fun(absl::in_place_type<AddType>, 5);
+
+  fun = std::move(source_fun);
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType source_fun(absl::in_place_type<AddType>, 5);
+  AnyInvType fun(absl::in_place_type<AddType>, 20);
+
+  fun = std::move(source_fun);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignEmpty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType source_fun;
+  source_fun = std::move(source_fun);
+
+  // This space intentionally left blank.
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignNonempty) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType source_fun(absl::in_place_type<AddType>, 5);
+  source_fun = std::move(source_fun);
+
+  // This space intentionally left blank.
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun;
+  fun = nullptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
+
+  UnqualifiedFunType* const null_fun_ptr = nullptr;
+  AnyInvType fun;
+  fun = null_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using MemFunPtrType = typename TypeParam::MemFunPtrType;
+
+  const MemFunPtrType null_mem_fun_ptr = nullptr;
+  AnyInvType fun;
+  fun = null_mem_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrEmptyLhs) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+  using MemObjPtrType = typename TypeParam::MemObjPtrType;
+
+  const MemObjPtrType null_mem_obj_ptr = nullptr;
+  UnaryAnyInvType fun;
+  fun = null_mem_obj_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun;
+  fun = &Int::MemberFunctionAdd;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrEmptyLhs) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+
+  UnaryAnyInvType fun;
+  fun = &Int::value;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun;
+  fun = add_function;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric,
+             AssignCompatibleAnyInvocableEmptyLhsEmptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other;
+  AnyInvType fun;
+  fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+  EXPECT_EQ(other, nullptr);               // NOLINT
+  EXPECT_EQ(nullptr, other);               // NOLINT
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric,
+             AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other = &add_function;
+  AnyInvType fun;
+  fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = &mult_function;
+  fun = nullptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
+
+  UnqualifiedFunType* const null_fun_ptr = nullptr;
+  AnyInvType fun = &mult_function;
+  fun = null_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using MemFunPtrType = typename TypeParam::MemFunPtrType;
+
+  const MemFunPtrType null_mem_fun_ptr = nullptr;
+  AnyInvType fun = &mult_function;
+  fun = null_mem_fun_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrNonemptyLhs) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+  using MemObjPtrType = typename TypeParam::MemObjPtrType;
+
+  const MemObjPtrType null_mem_obj_ptr = nullptr;
+  UnaryAnyInvType fun = &square_function;
+  fun = null_mem_obj_ptr;
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = &mult_function;
+  fun = &Int::MemberFunctionAdd;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrNonemptyLhs) {
+  using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
+
+  UnaryAnyInvType fun = &square_function;
+  fun = &Int::value;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  AnyInvType fun = &mult_function;
+  fun = add_function;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric,
+             AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other;
+  AnyInvType fun = &mult_function;
+  fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+  EXPECT_EQ(other, nullptr);               // NOLINT
+  EXPECT_EQ(nullptr, other);               // NOLINT
+
+  EXPECT_FALSE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric,
+             AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
+
+  CompatibleAnyInvType other = &add_function;
+  AnyInvType fun = &mult_function;
+  fun = std::move(other);
+
+  EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsEmptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  // Swap idiom
+  {
+    AnyInvType fun;
+    AnyInvType other;
+
+    using std::swap;
+    swap(fun, other);
+
+    EXPECT_FALSE(static_cast<bool>(fun));
+    EXPECT_FALSE(static_cast<bool>(other));
+
+    EXPECT_TRUE(
+        absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
+  }
+
+  // Member swap
+  {
+    AnyInvType fun;
+    AnyInvType other;
+
+    fun.swap(other);
+
+    EXPECT_FALSE(static_cast<bool>(fun));
+    EXPECT_FALSE(static_cast<bool>(other));
+
+    EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
+  }
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  // Swap idiom
+  {
+    AnyInvType fun;
+    AnyInvType other(absl::in_place_type<AddType>, 5);
+
+    using std::swap;
+    swap(fun, other);
+
+    EXPECT_TRUE(static_cast<bool>(fun));
+    EXPECT_FALSE(static_cast<bool>(other));
+
+    EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+    EXPECT_TRUE(
+        absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
+  }
+
+  // Member swap
+  {
+    AnyInvType fun;
+    AnyInvType other(absl::in_place_type<AddType>, 5);
+
+    fun.swap(other);
+
+    EXPECT_TRUE(static_cast<bool>(fun));
+    EXPECT_FALSE(static_cast<bool>(other));
+
+    EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+    EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
+  }
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsEmptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  // Swap idiom
+  {
+    AnyInvType fun(absl::in_place_type<AddType>, 5);
+    AnyInvType other;
+
+    using std::swap;
+    swap(fun, other);
+
+    EXPECT_FALSE(static_cast<bool>(fun));
+    EXPECT_TRUE(static_cast<bool>(other));
+
+    EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
+
+    EXPECT_TRUE(
+        absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
+  }
+
+  // Member swap
+  {
+    AnyInvType fun(absl::in_place_type<AddType>, 5);
+    AnyInvType other;
+
+    fun.swap(other);
+
+    EXPECT_FALSE(static_cast<bool>(fun));
+    EXPECT_TRUE(static_cast<bool>(other));
+
+    EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
+
+    EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
+  }
+}
+
+TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsNonemptyRhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  // Swap idiom
+  {
+    AnyInvType fun(absl::in_place_type<AddType>, 5);
+    AnyInvType other(absl::in_place_type<AddType>, 6);
+
+    using std::swap;
+    swap(fun, other);
+
+    EXPECT_TRUE(static_cast<bool>(fun));
+    EXPECT_TRUE(static_cast<bool>(other));
+
+    EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+    EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
+
+    EXPECT_TRUE(
+        absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
+  }
+
+  // Member swap
+  {
+    AnyInvType fun(absl::in_place_type<AddType>, 5);
+    AnyInvType other(absl::in_place_type<AddType>, 6);
+
+    fun.swap(other);
+
+    EXPECT_TRUE(static_cast<bool>(fun));
+    EXPECT_TRUE(static_cast<bool>(other));
+
+    EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+    EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
+
+    EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
+  }
+}
+
+template <class T>
+class AnyInvTestMovable : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestMovable);
+
+TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionUserDefinedType) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun(AddType(5));
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionVoidCovariance) {
+  using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  VoidAnyInvType fun(AddType(5));
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun;
+  fun = AddType(5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun = &add_function;
+  fun = AddType(5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+TYPED_TEST_P(AnyInvTestMovable, ConversionAssignVoidCovariance) {
+  using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  VoidAnyInvType fun;
+  fun = AddType(5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+}
+
+template <class T>
+class AnyInvTestNoexceptFalse : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse);
+
+TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionConstructionConstraints) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  EXPECT_TRUE((std::is_constructible<
+               AnyInvType,
+               typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
+  EXPECT_FALSE((
+      std::is_constructible<AnyInvType,
+                            typename TypeParam::IncompatibleInvocable>::value));
+}
+
+TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionAssignConstraints) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  EXPECT_TRUE((std::is_assignable<
+               AnyInvType&,
+               typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
+  EXPECT_FALSE(
+      (std::is_assignable<AnyInvType&,
+                          typename TypeParam::IncompatibleInvocable>::value));
+}
+
+template <class T>
+class AnyInvTestNoexceptTrue : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue);
+
+TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionConstructionConstraints) {
+#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
+  GTEST_SKIP() << "Noexcept was not part of the type system before C++17.";
+#else
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+// TODO(b/217761454): Fix this and re-enable for MSVC.
+#ifndef _MSC_VER
+  EXPECT_FALSE((std::is_constructible<
+                AnyInvType,
+                typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
+#endif
+  EXPECT_FALSE((
+      std::is_constructible<AnyInvType,
+                            typename TypeParam::IncompatibleInvocable>::value));
+#endif
+}
+
+TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionAssignConstraints) {
+#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
+  GTEST_SKIP() << "Noexcept was not part of the type system before C++17.";
+#else
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+// TODO(b/217761454): Fix this and re-enable for MSVC.
+#ifndef _MSC_VER
+  EXPECT_FALSE((std::is_assignable<
+                AnyInvType&,
+                typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
+#endif
+  EXPECT_FALSE(
+      (std::is_assignable<AnyInvType&,
+                          typename TypeParam::IncompatibleInvocable>::value));
+#endif
+}
+
+template <class T>
+class AnyInvTestNonRvalue : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestNonRvalue);
+
+TYPED_TEST_P(AnyInvTestNonRvalue, ConversionConstructionReferenceWrapper) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AddType add(4);
+  AnyInvType fun = std::ref(add);
+  add.state = 5;
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+TYPED_TEST_P(AnyInvTestNonRvalue, NonMoveableResultType) {
+#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
+  GTEST_SKIP() << "Copy/move elision was not standard before C++17";
+#else
+  // Define a result type that cannot be copy- or move-constructed.
+  struct Result {
+    int x;
+
+    explicit Result(const int x_in) : x(x_in) {}
+    Result(Result&&) = delete;
+  };
+
+  static_assert(!std::is_move_constructible<Result>::value, "");
+  static_assert(!std::is_copy_constructible<Result>::value, "");
+
+  // Assumption check: it should nevertheless be possible to use functors that
+  // return a Result struct according to the language rules.
+  const auto return_17 = []() noexcept { return Result(17); };
+  EXPECT_EQ(17, return_17().x);
+
+  // Just like plain functors, it should work fine to use an AnyInvocable that
+  // returns the non-moveable type.
+  using UnqualifiedFun =
+      absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>;
+
+  using Fun =
+      GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>;
+
+  AnyInvocable<Fun> any_inv(return_17);
+  EXPECT_EQ(17, any_inv().x);
+#endif
+}
+
+TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperEmptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AddType add(4);
+  AnyInvType fun;
+  fun = std::ref(add);
+  add.state = 5;
+  EXPECT_TRUE(
+      (std::is_nothrow_assignable<AnyInvType&,
+                                  std::reference_wrapper<AddType>>::value));
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperNonemptyLhs) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AddType add(4);
+  AnyInvType fun = &mult_function;
+  fun = std::ref(add);
+  add.state = 5;
+  EXPECT_TRUE(
+      (std::is_nothrow_assignable<AnyInvType&,
+                                  std::reference_wrapper<AddType>>::value));
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
+}
+
+template <class T>
+class AnyInvTestRvalue : public ::testing::Test {};
+
+TYPED_TEST_SUITE_P(AnyInvTestRvalue);
+
+TYPED_TEST_P(AnyInvTestRvalue, ConversionConstructionReferenceWrapper) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  EXPECT_FALSE((
+      std::is_convertible<std::reference_wrapper<AddType>, AnyInvType>::value));
+}
+
+TYPED_TEST_P(AnyInvTestRvalue, NonMoveableResultType) {
+#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
+  GTEST_SKIP() << "Copy/move elision was not standard before C++17";
+#else
+  // Define a result type that cannot be copy- or move-constructed.
+  struct Result {
+    int x;
+
+    explicit Result(const int x_in) : x(x_in) {}
+    Result(Result&&) = delete;
+  };
+
+  static_assert(!std::is_move_constructible<Result>::value, "");
+  static_assert(!std::is_copy_constructible<Result>::value, "");
+
+  // Assumption check: it should nevertheless be possible to use functors that
+  // return a Result struct according to the language rules.
+  const auto return_17 = []() noexcept { return Result(17); };
+  EXPECT_EQ(17, return_17().x);
+
+  // Just like plain functors, it should work fine to use an AnyInvocable that
+  // returns the non-moveable type.
+  using UnqualifiedFun =
+      absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>;
+
+  using Fun =
+      GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>;
+
+  EXPECT_EQ(17, AnyInvocable<Fun>(return_17)().x);
+#endif
+}
+
+TYPED_TEST_P(AnyInvTestRvalue, ConversionAssignReferenceWrapper) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  EXPECT_FALSE((
+      std::is_assignable<AnyInvType&, std::reference_wrapper<AddType>>::value));
+}
+
+// NOTE: This test suite originally attempted to enumerate all possible
+// combinations of type properties but the build-time started getting too large.
+// Instead, it is now assumed that certain parameters are orthogonal and so
+// some combinations are elided.
+
+// A metafunction to form a TypeList of all cv and non-rvalue ref combinations,
+// coupled with all of the other explicitly specified parameters.
+template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec,
+          ObjSize Size, ObjAlign Align>
+using NonRvalueQualifiedTestParams = ::testing::Types<               //
+    TestParams<Mov, Dest, _, CallExceptionSpec, Size, Align>,        //
+    TestParams<Mov, Dest, const _, CallExceptionSpec, Size, Align>,  //
+    TestParams<Mov, Dest, _&, CallExceptionSpec, Size, Align>,       //
+    TestParams<Mov, Dest, const _&, CallExceptionSpec, Size, Align>>;
+
+// A metafunction to form a TypeList of const and non-const rvalue ref
+// qualifiers, coupled with all of the other explicitly specified parameters.
+template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec,
+          ObjSize Size, ObjAlign Align>
+using RvalueQualifiedTestParams = ::testing::Types<
+    TestParams<Mov, Dest, _&&, CallExceptionSpec, Size, Align>,       //
+    TestParams<Mov, Dest, const _&&, CallExceptionSpec, Size, Align>  //
+    >;
+
+// All qualifier combinations and a noexcept function type
+using TestParameterListNonRvalueQualifiersNothrowCall =
+    NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
+                                 NothrowCall::yes, ObjSize::small,
+                                 ObjAlign::normal>;
+using TestParameterListRvalueQualifiersNothrowCall =
+    RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
+                              NothrowCall::yes, ObjSize::small,
+                              ObjAlign::normal>;
+
+// All qualifier combinations and a non-noexcept function type
+using TestParameterListNonRvalueQualifiersCallMayThrow =
+    NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
+                                 NothrowCall::no, ObjSize::small,
+                                 ObjAlign::normal>;
+using TestParameterListRvalueQualifiersCallMayThrow =
+    RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
+                              NothrowCall::no, ObjSize::small,
+                              ObjAlign::normal>;
+
+// Lists of various cases that should lead to remote storage
+using TestParameterListRemoteMovable = ::testing::Types<
+    // "Normal" aligned types that are large and have trivial destructors
+    TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+    TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+    TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+
+    // Same as above but with non-trivial destructors
+    TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+    TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+    TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>  //
+
+// Dynamic memory allocation for over-aligned data was introduced in C++17.
+// See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+    // Types that must use remote storage because of a large alignment.
+    ,
+    TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::large>,  //
+    TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::large>,  //
+    TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::large>,  //
+    TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::large>  //
+#endif
+    >;
+using TestParameterListRemoteNonMovable = ::testing::Types<
+    // "Normal" aligned types that are large and have trivial destructors
+    TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>,  //
+    // Same as above but with non-trivial destructors
+    TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no,
+               ObjSize::large, ObjAlign::normal>  //
+    >;
+
+// Parameters that lead to local storage
+using TestParameterListLocal = ::testing::Types<
+    // Types that meet the requirements and have trivial destructors
+    TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+
+    // Same as above but with non-trivial destructors
+    TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>,  //
+    TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
+               ObjSize::small, ObjAlign::normal>  //
+    >;
+
+// All of the tests that are run for every possible combination of types.
+REGISTER_TYPED_TEST_SUITE_P(
+    AnyInvTestBasic, DefaultConstruction, ConstructionNullptr,
+    ConstructionNullFunctionPtr, ConstructionNullMemberFunctionPtr,
+    ConstructionNullMemberObjectPtr, ConstructionMemberFunctionPtr,
+    ConstructionMemberObjectPtr, ConstructionFunctionReferenceDecay,
+    ConstructionCompatibleAnyInvocableEmpty,
+    ConstructionCompatibleAnyInvocableNonempty, InPlaceConstruction,
+    ConversionToBool, Invocation, InPlaceConstructionInitializerList,
+    InPlaceNullFunPtrConstruction, InPlaceNullFunPtrConstructionValueInit,
+    InPlaceNullMemFunPtrConstruction, InPlaceNullMemFunPtrConstructionValueInit,
+    InPlaceNullMemObjPtrConstruction, InPlaceNullMemObjPtrConstructionValueInit,
+    InPlaceVoidCovarianceConstruction, MoveConstructionFromEmpty,
+    MoveConstructionFromNonEmpty, ComparisonWithNullptrEmpty,
+    ComparisonWithNullptrNonempty, ResultType);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(
+    NonRvalueCallMayThrow, AnyInvTestBasic,
+    TestParameterListNonRvalueQualifiersCallMayThrow);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestBasic,
+                               TestParameterListRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestBasic,
+                               TestParameterListRemoteMovable);
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestBasic,
+                               TestParameterListRemoteNonMovable);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestBasic, TestParameterListLocal);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestBasic,
+                               TestParameterListNonRvalueQualifiersNothrowCall);
+INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestBasic,
+                               TestParameterListRvalueQualifiersNothrowCall);
+
+// Tests for functions that take two operands.
+REGISTER_TYPED_TEST_SUITE_P(
+    AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs,
+    MoveAssignEmptyLhsNonemptyRhs, MoveAssignNonemptyEmptyLhsRhs,
+    MoveAssignNonemptyLhsNonemptyRhs, SelfMoveAssignEmpty,
+    SelfMoveAssignNonempty, AssignNullptrEmptyLhs,
+    AssignNullFunctionPtrEmptyLhs, AssignNullMemberFunctionPtrEmptyLhs,
+    AssignNullMemberObjectPtrEmptyLhs, AssignMemberFunctionPtrEmptyLhs,
+    AssignMemberObjectPtrEmptyLhs, AssignFunctionReferenceDecayEmptyLhs,
+    AssignCompatibleAnyInvocableEmptyLhsEmptyRhs,
+    AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs, AssignNullptrNonemptyLhs,
+    AssignNullFunctionPtrNonemptyLhs, AssignNullMemberFunctionPtrNonemptyLhs,
+    AssignNullMemberObjectPtrNonemptyLhs, AssignMemberFunctionPtrNonemptyLhs,
+    AssignMemberObjectPtrNonemptyLhs, AssignFunctionReferenceDecayNonemptyLhs,
+    AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs,
+    AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs, SwapEmptyLhsEmptyRhs,
+    SwapEmptyLhsNonemptyRhs, SwapNonemptyLhsEmptyRhs,
+    SwapNonemptyLhsNonemptyRhs);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(
+    NonRvalueCallMayThrow, AnyInvTestCombinatoric,
+    TestParameterListNonRvalueQualifiersCallMayThrow);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestCombinatoric,
+                               TestParameterListRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestCombinatoric,
+                               TestParameterListRemoteMovable);
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestCombinatoric,
+                               TestParameterListRemoteNonMovable);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestCombinatoric,
+                               TestParameterListLocal);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestCombinatoric,
+                               TestParameterListNonRvalueQualifiersNothrowCall);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestCombinatoric,
+                               TestParameterListRvalueQualifiersNothrowCall);
+
+REGISTER_TYPED_TEST_SUITE_P(AnyInvTestMovable,
+                            ConversionConstructionUserDefinedType,
+                            ConversionConstructionVoidCovariance,
+                            ConversionAssignUserDefinedTypeEmptyLhs,
+                            ConversionAssignUserDefinedTypeNonemptyLhs,
+                            ConversionAssignVoidCovariance);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(
+    NonRvalueCallMayThrow, AnyInvTestMovable,
+    TestParameterListNonRvalueQualifiersCallMayThrow);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestMovable,
+                               TestParameterListRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestMovable,
+                               TestParameterListRemoteMovable);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestMovable,
+                               TestParameterListLocal);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestMovable,
+                               TestParameterListNonRvalueQualifiersNothrowCall);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestMovable,
+                               TestParameterListRvalueQualifiersNothrowCall);
+
+REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse,
+                            ConversionConstructionConstraints,
+                            ConversionAssignConstraints);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(
+    NonRvalueCallMayThrow, AnyInvTestNoexceptFalse,
+    TestParameterListNonRvalueQualifiersCallMayThrow);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestNoexceptFalse,
+                               TestParameterListRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNoexceptFalse,
+                               TestParameterListRemoteMovable);
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNoexceptFalse,
+                               TestParameterListRemoteNonMovable);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNoexceptFalse,
+                               TestParameterListLocal);
+
+REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue,
+                            ConversionConstructionConstraints,
+                            ConversionAssignConstraints);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNoexceptTrue,
+                               TestParameterListNonRvalueQualifiersNothrowCall);
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestNoexceptTrue,
+                               TestParameterListRvalueQualifiersNothrowCall);
+
+REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNonRvalue,
+                            ConversionConstructionReferenceWrapper,
+                            NonMoveableResultType,
+                            ConversionAssignReferenceWrapperEmptyLhs,
+                            ConversionAssignReferenceWrapperNonemptyLhs);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(
+    NonRvalueCallMayThrow, AnyInvTestNonRvalue,
+    TestParameterListNonRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNonRvalue,
+                               TestParameterListRemoteMovable);
+INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNonRvalue,
+                               TestParameterListRemoteNonMovable);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNonRvalue,
+                               TestParameterListLocal);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNonRvalue,
+                               TestParameterListNonRvalueQualifiersNothrowCall);
+
+REGISTER_TYPED_TEST_SUITE_P(AnyInvTestRvalue,
+                            ConversionConstructionReferenceWrapper,
+                            NonMoveableResultType,
+                            ConversionAssignReferenceWrapper);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestRvalue,
+                               TestParameterListRvalueQualifiersCallMayThrow);
+
+INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestRvalue,
+                               TestParameterListRvalueQualifiersNothrowCall);
+
+// Minimal SFINAE testing for platforms where we can't run the tests, but we can
+// build binaries for.
+static_assert(
+    std::is_convertible<void (*)(), absl::AnyInvocable<void() &&>>::value, "");
+static_assert(!std::is_convertible<void*, absl::AnyInvocable<void() &&>>::value,
+              "");
+
+#undef ABSL_INTERNAL_NOEXCEPT_SPEC
+
+}  // namespace
diff --git a/absl/functional/function_type_benchmark.cc b/absl/functional/function_type_benchmark.cc
index 1b27eeb..03dc31d 100644
--- a/absl/functional/function_type_benchmark.cc
+++ b/absl/functional/function_type_benchmark.cc
@@ -18,6 +18,7 @@
 
 #include "benchmark/benchmark.h"
 #include "absl/base/attributes.h"
+#include "absl/functional/any_invocable.h"
 #include "absl/functional/function_ref.h"
 
 namespace absl {
@@ -62,6 +63,12 @@
 }
 BENCHMARK(BM_TrivialFunctionRef);
 
+void BM_TrivialAnyInvocable(benchmark::State& state) {
+  ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state,
+                                                          TrivialFunctor{});
+}
+BENCHMARK(BM_TrivialAnyInvocable);
+
 void BM_LargeStdFunction(benchmark::State& state) {
   ConstructAndCallFunctionBenchmark<std::function<void()>>(state,
                                                            LargeFunctor{});
@@ -73,6 +80,13 @@
 }
 BENCHMARK(BM_LargeFunctionRef);
 
+
+void BM_LargeAnyInvocable(benchmark::State& state) {
+  ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state,
+                                                          LargeFunctor{});
+}
+BENCHMARK(BM_LargeAnyInvocable);
+
 void BM_FunPtrStdFunction(benchmark::State& state) {
   ConstructAndCallFunctionBenchmark<std::function<void()>>(state, FreeFunction);
 }
@@ -83,6 +97,11 @@
 }
 BENCHMARK(BM_FunPtrFunctionRef);
 
+void BM_FunPtrAnyInvocable(benchmark::State& state) {
+  ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state, FreeFunction);
+}
+BENCHMARK(BM_FunPtrAnyInvocable);
+
 // Doesn't include construction or copy overhead in the loop.
 template <typename Function, typename Callable, typename... Args>
 void CallFunctionBenchmark(benchmark::State& state, const Callable& c,
@@ -114,6 +133,12 @@
 }
 BENCHMARK(BM_TrivialArgsFunctionRef);
 
+void BM_TrivialArgsAnyInvocable(benchmark::State& state) {
+  CallFunctionBenchmark<AnyInvocable<void(int, int, int)>>(
+      state, FunctorWithTrivialArgs{}, 1, 2, 3);
+}
+BENCHMARK(BM_TrivialArgsAnyInvocable);
+
 struct FunctorWithNonTrivialArgs {
   void operator()(std::string a, std::string b, std::string c) const {
     benchmark::DoNotOptimize(&a);
@@ -138,6 +163,14 @@
 }
 BENCHMARK(BM_NonTrivialArgsFunctionRef);
 
+void BM_NonTrivialArgsAnyInvocable(benchmark::State& state) {
+  std::string a, b, c;
+  CallFunctionBenchmark<
+      AnyInvocable<void(std::string, std::string, std::string)>>(
+      state, FunctorWithNonTrivialArgs{}, a, b, c);
+}
+BENCHMARK(BM_NonTrivialArgsAnyInvocable);
+
 }  // namespace
 ABSL_NAMESPACE_END
 }  // namespace absl
diff --git a/absl/functional/internal/any_invocable.h b/absl/functional/internal/any_invocable.h
new file mode 100644
index 0000000..f353139
--- /dev/null
+++ b/absl/functional/internal/any_invocable.h
@@ -0,0 +1,857 @@
+// Copyright 2022 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Implementation details for `absl::AnyInvocable`
+
+#ifndef ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_
+#define ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_
+
+////////////////////////////////////////////////////////////////////////////////
+//                                                                            //
+// This implementation of the proposed `any_invocable` uses an approach that  //
+// chooses between local storage and remote storage for the contained target  //
+// object based on the target object's size, alignment requirements, and      //
+// whether or not it has a nothrow move constructor. Additional optimizations //
+// are performed when the object is a trivially copyable type [basic.types].  //
+//                                                                            //
+// There are three datamembers per `AnyInvocable` instance                    //
+//                                                                            //
+// 1) A union containing either                                               //
+//        - A pointer to the target object referred to via a void*, or        //
+//        - the target object, emplaced into a raw char buffer                //
+//                                                                            //
+// 2) A function pointer to a "manager" function operation that takes a       //
+//    discriminator and logically branches to either perform a move operation //
+//    or destroy operation based on that discriminator.                       //
+//                                                                            //
+// 3) A function pointer to an "invoker" function operation that invokes the  //
+//    target object, directly returning the result.                           //
+//                                                                            //
+// When in the logically empty state, the manager function is an empty        //
+// function and the invoker function is one that would be undefined-behavior  //
+// to call.                                                                   //
+//                                                                            //
+// An additional optimization is performed when converting from one           //
+// AnyInvocable to another where only the noexcept specification and/or the   //
+// cv/ref qualifiers of the function type differ. In these cases, the         //
+// conversion works by "moving the guts", similar to if they were the same    //
+// exact type, as opposed to having to perform an additional layer of         //
+// wrapping through remote storage.                                           //
+//                                                                            //
+////////////////////////////////////////////////////////////////////////////////
+
+// IWYU pragma: private, include "absl/functional/any_invocable.h"
+
+#include <cassert>
+#include <cstddef>
+#include <cstring>
+#include <functional>
+#include <initializer_list>
+#include <memory>
+#include <new>
+#include <type_traits>
+#include <utility>
+
+#include "absl/base/config.h"
+#include "absl/base/internal/invoke.h"
+#include "absl/base/macros.h"
+#include "absl/meta/type_traits.h"
+#include "absl/utility/utility.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+
+// Helper macro used to prevent spelling `noexcept` in language versions older
+// than C++17, where it is not part of the type system, in order to avoid
+// compilation failures and internal compiler errors.
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) noexcept(noex)
+#else
+#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex)
+#endif
+
+// Defined in functional/any_invocable.h
+template <class Sig>
+class AnyInvocable;
+
+namespace internal_any_invocable {
+
+// Constants relating to the small-object-storage for AnyInvocable
+enum StorageProperty : std::size_t {
+  kAlignment = alignof(std::max_align_t),  // The alignment of the storage
+  kStorageSize = sizeof(void*) * 2         // The size of the storage
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// A metafunction for checking if a type is an AnyInvocable instantiation.
+// This is used during conversion operations.
+template <class T>
+struct IsAnyInvocable : std::false_type {};
+
+template <class Sig>
+struct IsAnyInvocable<AnyInvocable<Sig>> : std::true_type {};
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// A type trait that tells us whether or not a target function type should be
+// stored locally in the small object optimization storage
+template <class T>
+using IsStoredLocally = std::integral_constant<
+    bool, sizeof(T) <= kStorageSize && alignof(T) <= kAlignment &&
+              kAlignment % alignof(T) == 0 &&
+              std::is_nothrow_move_constructible<T>::value>;
+
+// An implementation of std::remove_cvref_t of C++20.
+template <class T>
+using RemoveCVRef =
+    typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// An implementation of the C++ standard INVOKE<R> pseudo-macro, operation is
+// equivalent to std::invoke except that it forces an implicit conversion to the
+// specified return type. If "R" is void, the function is executed and the
+// return value is simply ignored.
+template <class ReturnType, class F, class... P,
+          typename = absl::enable_if_t<std::is_void<ReturnType>::value>>
+void InvokeR(F&& f, P&&... args) {
+  absl::base_internal::invoke(std::forward<F>(f), std::forward<P>(args)...);
+}
+
+template <class ReturnType, class F, class... P,
+          absl::enable_if_t<!std::is_void<ReturnType>::value, int> = 0>
+ReturnType InvokeR(F&& f, P&&... args) {
+  return absl::base_internal::invoke(std::forward<F>(f),
+                                     std::forward<P>(args)...);
+}
+
+//
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+///
+// A metafunction that takes a "T" corresponding to a parameter type of the
+// user's specified function type, and yields the parameter type to use for the
+// type-erased invoker. In order to prevent observable moves, this must be
+// either a reference or, if the type is trivial, the original parameter type
+// itself. Since the parameter type may be incomplete at the point that this
+// metafunction is used, we can only do this optimization for scalar types
+// rather than for any trivial type.
+template <typename T>
+T ForwardImpl(std::true_type);
+
+template <typename T>
+T&& ForwardImpl(std::false_type);
+
+// NOTE: We deliberately use an intermediate struct instead of a direct alias,
+// as a workaround for b/206991861 on MSVC versions < 1924.
+template <class T>
+struct ForwardedParameter {
+  using type = decltype((
+      ForwardImpl<T>)(std::integral_constant<bool,
+                                             std::is_scalar<T>::value>()));
+};
+
+template <class T>
+using ForwardedParameterType = typename ForwardedParameter<T>::type;
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// A discriminator when calling the "manager" function that describes operation
+// type-erased operation should be invoked.
+//
+// "relocate_from_to" specifies that the manager should perform a move.
+//
+// "dispose" specifies that the manager should perform a destroy.
+enum class FunctionToCall : bool { relocate_from_to, dispose };
+
+// The portion of `AnyInvocable` state that contains either a pointer to the
+// target object or the object itself in local storage
+union TypeErasedState {
+  struct {
+    // A pointer to the type-erased object when remotely stored
+    void* target;
+    // The size of the object for `RemoteManagerTrivial`
+    std::size_t size;
+  } remote;
+
+  // Local-storage for the type-erased object when small and trivial enough
+  alignas(kAlignment) char storage[kStorageSize];
+};
+
+// A typed accessor for the object in `TypeErasedState` storage
+template <class T>
+T& ObjectInLocalStorage(TypeErasedState* const state) {
+  // We launder here because the storage may be reused with the same type.
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+  return *std::launder(reinterpret_cast<T*>(&state->storage));
+#elif ABSL_HAVE_BUILTIN(__builtin_launder)
+  return *__builtin_launder(reinterpret_cast<T*>(&state->storage));
+#else
+
+  // When `std::launder` or equivalent are not available, we rely on undefined
+  // behavior, which works as intended on Abseil's officially supported
+  // platforms as of Q2 2022.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#pragma GCC diagnostic push
+#endif
+  return *reinterpret_cast<T*>(&state->storage);
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+#endif
+}
+
+// The type for functions issuing lifetime-related operations: move and dispose
+// A pointer to such a function is contained in each `AnyInvocable` instance.
+// NOTE: When specifying `FunctionToCall::`dispose, the same state must be
+// passed as both "from" and "to".
+using ManagerType = void(FunctionToCall /*operation*/,
+                         TypeErasedState* /*from*/, TypeErasedState* /*to*/)
+    ABSL_INTERNAL_NOEXCEPT_SPEC(true);
+
+// The type for functions issuing the actual invocation of the object
+// A pointer to such a function is contained in each AnyInvocable instance.
+template <bool SigIsNoexcept, class ReturnType, class... P>
+using InvokerType = ReturnType(TypeErasedState*, ForwardedParameterType<P>...)
+    ABSL_INTERNAL_NOEXCEPT_SPEC(SigIsNoexcept);
+
+// The manager that is used when AnyInvocable is empty
+inline void EmptyManager(FunctionToCall /*operation*/,
+                         TypeErasedState* /*from*/,
+                         TypeErasedState* /*to*/) noexcept {}
+
+// The manager that is used when a target function is in local storage and is
+// a trivially copyable type.
+inline void LocalManagerTrivial(FunctionToCall /*operation*/,
+                                TypeErasedState* const from,
+                                TypeErasedState* const to) noexcept {
+  // This single statement without branching handles both possible operations.
+  //
+  // For FunctionToCall::dispose, "from" and "to" point to the same state, and
+  // so this assignment logically would do nothing.
+  //
+  // Note: Correctness here relies on http://wg21.link/p0593, which has only
+  // become standard in C++20, though implementations do not break it in
+  // practice for earlier versions of C++.
+  //
+  // The correct way to do this without that paper is to first placement-new a
+  // default-constructed T in "to->storage" prior to the memmove, but doing so
+  // requires a different function to be created for each T that is stored
+  // locally, which can cause unnecessary bloat and be less cache friendly.
+  *to = *from;
+
+  // Note: Because the type is trivially copyable, the destructor does not need
+  // to be called ("trivially copyable" requires a trivial destructor).
+}
+
+// The manager that is used when a target function is in local storage and is
+// not a trivially copyable type.
+template <class T>
+void LocalManagerNontrivial(FunctionToCall operation,
+                            TypeErasedState* const from,
+                            TypeErasedState* const to) noexcept {
+  static_assert(IsStoredLocally<T>::value,
+                "Local storage must only be used for supported types.");
+  static_assert(!std::is_trivially_copyable<T>::value,
+                "Locally stored types must be trivially copyable.");
+
+  T& from_object = (ObjectInLocalStorage<T>)(from);
+
+  switch (operation) {
+    case FunctionToCall::relocate_from_to:
+      // NOTE: Requires that the left-hand operand is already empty.
+      ::new (static_cast<void*>(&to->storage)) T(std::move(from_object));
+      ABSL_FALLTHROUGH_INTENDED;
+    case FunctionToCall::dispose:
+      from_object.~T();  // Must not throw. // NOLINT
+      return;
+  }
+  ABSL_INTERNAL_UNREACHABLE;
+}
+
+// The invoker that is used when a target function is in local storage
+// Note: QualTRef here is the target function type along with cv and reference
+// qualifiers that must be used when calling the function.
+template <bool SigIsNoexcept, class ReturnType, class QualTRef, class... P>
+ReturnType LocalInvoker(
+    TypeErasedState* const state,
+    ForwardedParameterType<P>... args) noexcept(SigIsNoexcept) {
+  using RawT = RemoveCVRef<QualTRef>;
+  static_assert(
+      IsStoredLocally<RawT>::value,
+      "Target object must be in local storage in order to be invoked from it.");
+
+  auto& f = (ObjectInLocalStorage<RawT>)(state);
+  return (InvokeR<ReturnType>)(static_cast<QualTRef>(f),
+                               static_cast<ForwardedParameterType<P>>(args)...);
+}
+
+// The manager that is used when a target function is in remote storage and it
+// has a trivial destructor
+inline void RemoteManagerTrivial(FunctionToCall operation,
+                                 TypeErasedState* const from,
+                                 TypeErasedState* const to) noexcept {
+  switch (operation) {
+    case FunctionToCall::relocate_from_to:
+      // NOTE: Requires that the left-hand operand is already empty.
+      to->remote = from->remote;
+      return;
+    case FunctionToCall::dispose:
+#if defined(__cpp_sized_deallocation)
+      ::operator delete(from->remote.target, from->remote.size);
+#else   // __cpp_sized_deallocation
+      ::operator delete(from->remote.target);
+#endif  // __cpp_sized_deallocation
+      return;
+  }
+  ABSL_INTERNAL_UNREACHABLE;
+}
+
+// The manager that is used when a target function is in remote storage and the
+// destructor of the type is not trivial
+template <class T>
+void RemoteManagerNontrivial(FunctionToCall operation,
+                             TypeErasedState* const from,
+                             TypeErasedState* const to) noexcept {
+  static_assert(!IsStoredLocally<T>::value,
+                "Remote storage must only be used for types that do not "
+                "qualify for local storage.");
+
+  switch (operation) {
+    case FunctionToCall::relocate_from_to:
+      // NOTE: Requires that the left-hand operand is already empty.
+      to->remote.target = from->remote.target;
+      return;
+    case FunctionToCall::dispose:
+      ::delete static_cast<T*>(from->remote.target);  // Must not throw.
+      return;
+  }
+  ABSL_INTERNAL_UNREACHABLE;
+}
+
+// The invoker that is used when a target function is in remote storage
+template <bool SigIsNoexcept, class ReturnType, class QualTRef, class... P>
+ReturnType RemoteInvoker(
+    TypeErasedState* const state,
+    ForwardedParameterType<P>... args) noexcept(SigIsNoexcept) {
+  using RawT = RemoveCVRef<QualTRef>;
+  static_assert(!IsStoredLocally<RawT>::value,
+                "Target object must be in remote storage in order to be "
+                "invoked from it.");
+
+  auto& f = *static_cast<RawT*>(state->remote.target);
+  return (InvokeR<ReturnType>)(static_cast<QualTRef>(f),
+                               static_cast<ForwardedParameterType<P>>(args)...);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// A metafunction that checks if a type T is an instantiation of
+// absl::in_place_type_t (needed for constructor constraints of AnyInvocable).
+template <class T>
+struct IsInPlaceType : std::false_type {};
+
+template <class T>
+struct IsInPlaceType<absl::in_place_type_t<T>> : std::true_type {};
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// A constructor name-tag used with CoreImpl (below) to request the
+// conversion-constructor. QualDecayedTRef is the decayed-type of the object to
+// wrap, along with the cv and reference qualifiers that must be applied when
+// performing an invocation of the wrapped object.
+template <class QualDecayedTRef>
+struct TypedConversionConstruct {};
+
+// A helper base class for all core operations of AnyInvocable. Most notably,
+// this class creates the function call operator and constraint-checkers so that
+// the top-level class does not have to be a series of partial specializations.
+//
+// Note: This definition exists (as opposed to being a declaration) so that if
+// the user of the top-level template accidentally passes a template argument
+// that is not a function type, they will get a static_assert in AnyInvocable's
+// class body rather than an error stating that Impl is not defined.
+template <class Sig>
+class Impl {};  // Note: This is partially-specialized later.
+
+// A std::unique_ptr deleter that deletes memory allocated via ::operator new.
+#if defined(__cpp_sized_deallocation)
+class TrivialDeleter {
+ public:
+  explicit TrivialDeleter(std::size_t size) : size_(size) {}
+
+  void operator()(void* target) const {
+    ::operator delete(target, size_);
+  }
+
+ private:
+  std::size_t size_;
+};
+#else   // __cpp_sized_deallocation
+class TrivialDeleter {
+ public:
+  explicit TrivialDeleter(std::size_t) {}
+
+  void operator()(void* target) const { ::operator delete(target); }
+};
+#endif  // __cpp_sized_deallocation
+
+template <bool SigIsNoexcept, class ReturnType, class... P>
+class CoreImpl;
+
+constexpr bool IsCompatibleConversion(void*, void*) { return false; }
+template <bool NoExceptSrc, bool NoExceptDest, class... T>
+constexpr bool IsCompatibleConversion(CoreImpl<NoExceptSrc, T...>*,
+                                      CoreImpl<NoExceptDest, T...>*) {
+  return !NoExceptDest || NoExceptSrc;
+}
+
+// A helper base class for all core operations of AnyInvocable that do not
+// depend on the cv/ref qualifiers of the function type.
+template <bool SigIsNoexcept, class ReturnType, class... P>
+class CoreImpl {
+ public:
+  using result_type = ReturnType;
+
+  CoreImpl() noexcept : manager_(EmptyManager), invoker_(nullptr) {}
+
+  enum class TargetType : int {
+    kPointer = 0,
+    kCompatibleAnyInvocable = 1,
+    kIncompatibleAnyInvocable = 2,
+    kOther = 3,
+  };
+
+  // Note: QualDecayedTRef here includes the cv-ref qualifiers associated with
+  // the invocation of the Invocable. The unqualified type is the target object
+  // type to be stored.
+  template <class QualDecayedTRef, class F>
+  explicit CoreImpl(TypedConversionConstruct<QualDecayedTRef>, F&& f) {
+    using DecayedT = RemoveCVRef<QualDecayedTRef>;
+
+    constexpr TargetType kTargetType =
+        (std::is_pointer<DecayedT>::value ||
+         std::is_member_pointer<DecayedT>::value)
+            ? TargetType::kPointer
+        : IsCompatibleAnyInvocable<DecayedT>::value
+            ? TargetType::kCompatibleAnyInvocable
+        : IsAnyInvocable<DecayedT>::value
+            ? TargetType::kIncompatibleAnyInvocable
+            : TargetType::kOther;
+    // NOTE: We only use integers instead of enums as template parameters in
+    // order to work around a bug on C++14 under MSVC 2017.
+    // See b/236131881.
+    Initialize<static_cast<int>(kTargetType), QualDecayedTRef>(
+        std::forward<F>(f));
+  }
+
+  // Note: QualTRef here includes the cv-ref qualifiers associated with the
+  // invocation of the Invocable. The unqualified type is the target object
+  // type to be stored.
+  template <class QualTRef, class... Args>
+  explicit CoreImpl(absl::in_place_type_t<QualTRef>, Args&&... args) {
+    InitializeStorage<QualTRef>(std::forward<Args>(args)...);
+  }
+
+  CoreImpl(CoreImpl&& other) noexcept {
+    other.manager_(FunctionToCall::relocate_from_to, &other.state_, &state_);
+    manager_ = other.manager_;
+    invoker_ = other.invoker_;
+    other.manager_ = EmptyManager;
+    other.invoker_ = nullptr;
+  }
+
+  CoreImpl& operator=(CoreImpl&& other) noexcept {
+    // Put the left-hand operand in an empty state.
+    //
+    // Note: A full reset that leaves us with an object that has its invariants
+    // intact is necessary in order to handle self-move. This is required by
+    // types that are used with certain operations of the standard library, such
+    // as the default definition of std::swap when both operands target the same
+    // object.
+    Clear();
+
+    // Perform the actual move/destory operation on the target function.
+    other.manager_(FunctionToCall::relocate_from_to, &other.state_, &state_);
+    manager_ = other.manager_;
+    invoker_ = other.invoker_;
+    other.manager_ = EmptyManager;
+    other.invoker_ = nullptr;
+
+    return *this;
+  }
+
+  ~CoreImpl() { manager_(FunctionToCall::dispose, &state_, &state_); }
+
+  // Check whether or not the AnyInvocable is in the empty state.
+  bool HasValue() const { return invoker_ != nullptr; }
+
+  // Effects: Puts the object into its empty state.
+  void Clear() {
+    manager_(FunctionToCall::dispose, &state_, &state_);
+    manager_ = EmptyManager;
+    invoker_ = nullptr;
+  }
+
+  template <int target_type, class QualDecayedTRef, class F,
+            absl::enable_if_t<target_type == 0, int> = 0>
+  void Initialize(F&& f) {
+// This condition handles types that decay into pointers, which includes
+// function references. Since function references cannot be null, GCC warns
+// against comparing their decayed form with nullptr.
+// Since this is template-heavy code, we prefer to disable these warnings
+// locally instead of adding yet another overload of this function.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpragmas"
+#pragma GCC diagnostic ignored "-Waddress"
+#pragma GCC diagnostic ignored "-Wnonnull-compare"
+#pragma GCC diagnostic push
+#endif
+    if (static_cast<RemoveCVRef<QualDecayedTRef>>(f) == nullptr) {
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      manager_ = EmptyManager;
+      invoker_ = nullptr;
+      return;
+    }
+    InitializeStorage<QualDecayedTRef>(std::forward<F>(f));
+  }
+
+  template <int target_type, class QualDecayedTRef, class F,
+            absl::enable_if_t<target_type == 1, int> = 0>
+  void Initialize(F&& f) {
+    // In this case we can "steal the guts" of the other AnyInvocable.
+    f.manager_(FunctionToCall::relocate_from_to, &f.state_, &state_);
+    manager_ = f.manager_;
+    invoker_ = f.invoker_;
+
+    f.manager_ = EmptyManager;
+    f.invoker_ = nullptr;
+  }
+
+  template <int target_type, class QualDecayedTRef, class F,
+            absl::enable_if_t<target_type == 2, int> = 0>
+  void Initialize(F&& f) {
+    if (f.HasValue()) {
+      InitializeStorage<QualDecayedTRef>(std::forward<F>(f));
+    } else {
+      manager_ = EmptyManager;
+      invoker_ = nullptr;
+    }
+  }
+
+  template <int target_type, class QualDecayedTRef, class F,
+            typename = absl::enable_if_t<target_type == 3>>
+  void Initialize(F&& f) {
+    InitializeStorage<QualDecayedTRef>(std::forward<F>(f));
+  }
+
+  // Use local (inline) storage for applicable target object types.
+  template <class QualTRef, class... Args,
+            typename = absl::enable_if_t<
+                IsStoredLocally<RemoveCVRef<QualTRef>>::value>>
+  void InitializeStorage(Args&&... args) {
+    using RawT = RemoveCVRef<QualTRef>;
+    ::new (static_cast<void*>(&state_.storage))
+        RawT(std::forward<Args>(args)...);
+
+    invoker_ = LocalInvoker<SigIsNoexcept, ReturnType, QualTRef, P...>;
+    // We can simplify our manager if we know the type is trivially copyable.
+    InitializeLocalManager<RawT>();
+  }
+
+  // Use remote storage for target objects that cannot be stored locally.
+  template <class QualTRef, class... Args,
+            absl::enable_if_t<!IsStoredLocally<RemoveCVRef<QualTRef>>::value,
+                              int> = 0>
+  void InitializeStorage(Args&&... args) {
+    InitializeRemoteManager<RemoveCVRef<QualTRef>>(std::forward<Args>(args)...);
+    // This is set after everything else in case an exception is thrown in an
+    // earlier step of the initialization.
+    invoker_ = RemoteInvoker<SigIsNoexcept, ReturnType, QualTRef, P...>;
+  }
+
+  template <class T,
+            typename = absl::enable_if_t<std::is_trivially_copyable<T>::value>>
+  void InitializeLocalManager() {
+    manager_ = LocalManagerTrivial;
+  }
+
+  template <class T,
+            absl::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
+  void InitializeLocalManager() {
+    manager_ = LocalManagerNontrivial<T>;
+  }
+
+  template <class T>
+  using HasTrivialRemoteStorage =
+      std::integral_constant<bool, std::is_trivially_destructible<T>::value &&
+                                       alignof(T) <=
+                                           ABSL_INTERNAL_DEFAULT_NEW_ALIGNMENT>;
+
+  template <class T, class... Args,
+            typename = absl::enable_if_t<HasTrivialRemoteStorage<T>::value>>
+  void InitializeRemoteManager(Args&&... args) {
+    // unique_ptr is used for exception-safety in case construction throws.
+    std::unique_ptr<void, TrivialDeleter> uninitialized_target(
+        ::operator new(sizeof(T)), TrivialDeleter(sizeof(T)));
+    ::new (uninitialized_target.get()) T(std::forward<Args>(args)...);
+    state_.remote.target = uninitialized_target.release();
+    state_.remote.size = sizeof(T);
+    manager_ = RemoteManagerTrivial;
+  }
+
+  template <class T, class... Args,
+            absl::enable_if_t<!HasTrivialRemoteStorage<T>::value, int> = 0>
+  void InitializeRemoteManager(Args&&... args) {
+    state_.remote.target = ::new T(std::forward<Args>(args)...);
+    manager_ = RemoteManagerNontrivial<T>;
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //
+  // Type trait to determine if the template argument is an AnyInvocable whose
+  // function type is compatible enough with ours such that we can
+  // "move the guts" out of it when moving, rather than having to place a new
+  // object into remote storage.
+
+  template <typename Other>
+  struct IsCompatibleAnyInvocable {
+    static constexpr bool value = false;
+  };
+
+  template <typename Sig>
+  struct IsCompatibleAnyInvocable<AnyInvocable<Sig>> {
+    static constexpr bool value =
+        (IsCompatibleConversion)(static_cast<
+                                     typename AnyInvocable<Sig>::CoreImpl*>(
+                                     nullptr),
+                                 static_cast<CoreImpl*>(nullptr));
+  };
+
+  //
+  //////////////////////////////////////////////////////////////////////////////
+
+  TypeErasedState state_;
+  ManagerType* manager_;
+  InvokerType<SigIsNoexcept, ReturnType, P...>* invoker_;
+};
+
+// A constructor name-tag used with Impl to request the
+// conversion-constructor
+struct ConversionConstruct {};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// A metafunction that is normally an identity metafunction except that when
+// given a std::reference_wrapper<T>, it yields T&. This is necessary because
+// currently std::reference_wrapper's operator() is not conditionally noexcept,
+// so when checking if such an Invocable is nothrow-invocable, we must pull out
+// the underlying type.
+template <class T>
+struct UnwrapStdReferenceWrapperImpl {
+  using type = T;
+};
+
+template <class T>
+struct UnwrapStdReferenceWrapperImpl<std::reference_wrapper<T>> {
+  using type = T&;
+};
+
+template <class T>
+using UnwrapStdReferenceWrapper =
+    typename UnwrapStdReferenceWrapperImpl<T>::type;
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// An alias that always yields std::true_type (used with constraints) where
+// substitution failures happen when forming the template arguments.
+template <class... T>
+using True =
+    std::integral_constant<bool, sizeof(absl::void_t<T...>*) != 0>;
+
+/*SFINAE constraints for the conversion-constructor.*/
+template <class Sig, class F,
+          class = absl::enable_if_t<
+              !std::is_same<RemoveCVRef<F>, AnyInvocable<Sig>>::value>>
+using CanConvert =
+    True<absl::enable_if_t<!IsInPlaceType<RemoveCVRef<F>>::value>,
+         absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>,
+         absl::enable_if_t<
+             Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>,
+         absl::enable_if_t<std::is_constructible<absl::decay_t<F>, F>::value>>;
+
+/*SFINAE constraints for the std::in_place constructors.*/
+template <class Sig, class F, class... Args>
+using CanEmplace = True<
+    absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>,
+    absl::enable_if_t<
+        Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>,
+    absl::enable_if_t<std::is_constructible<absl::decay_t<F>, Args...>::value>>;
+
+/*SFINAE constraints for the conversion-assign operator.*/
+template <class Sig, class F,
+          class = absl::enable_if_t<
+              !std::is_same<RemoveCVRef<F>, AnyInvocable<Sig>>::value>>
+using CanAssign =
+    True<absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>,
+         absl::enable_if_t<
+             Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>,
+         absl::enable_if_t<std::is_constructible<absl::decay_t<F>, F>::value>>;
+
+/*SFINAE constraints for the reference-wrapper conversion-assign operator.*/
+template <class Sig, class F>
+using CanAssignReferenceWrapper =
+    True<absl::enable_if_t<
+             Impl<Sig>::template CallIsValid<std::reference_wrapper<F>>::value>,
+         absl::enable_if_t<Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<
+             std::reference_wrapper<F>>::value>>;
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// The constraint for checking whether or not a call meets the noexcept
+// callability requirements. This is a preprocessor macro because specifying it
+// this way as opposed to a disjunction/branch can improve the user-side error
+// messages and avoids an instantiation of std::is_nothrow_invocable_r in the
+// cases where the user did not specify a noexcept function type.
+//
+#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT(inv_quals, noex) \
+  ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_##noex(inv_quals)
+
+// The disjunction below is because we can't rely on std::is_nothrow_invocable_r
+// to give the right result when ReturnType is non-moveable in toolchains that
+// don't treat non-moveable result types correctly. For example this was the
+// case in libc++ before commit c3a24882 (2022-05).
+#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_true(inv_quals)      \
+  absl::enable_if_t<absl::disjunction<                                       \
+      std::is_nothrow_invocable_r<                                           \
+          ReturnType, UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals, \
+          P...>,                                                             \
+      std::conjunction<                                                      \
+          std::is_nothrow_invocable<                                         \
+              UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals, P...>,  \
+          std::is_same<                                                      \
+              ReturnType,                                                    \
+              absl::base_internal::invoke_result_t<                          \
+                  UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals,     \
+                  P...>>>>::value>
+
+#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_false(inv_quals)
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// A macro to generate partial specializations of Impl with the different
+// combinations of supported cv/reference qualifiers and noexcept specifier.
+//
+// Here, `cv` are the cv-qualifiers if any, `ref` is the ref-qualifier if any,
+// inv_quals is the reference type to be used when invoking the target, and
+// noex is "true" if the function type is noexcept, or false if it is not.
+//
+// The CallIsValid condition is more complicated than simply using
+// absl::base_internal::is_invocable_r because we can't rely on it to give the
+// right result when ReturnType is non-moveable in toolchains that don't treat
+// non-moveable result types correctly. For example this was the case in libc++
+// before commit c3a24882 (2022-05).
+#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, noex)            \
+  template <class ReturnType, class... P>                                      \
+  class Impl<ReturnType(P...) cv ref ABSL_INTERNAL_NOEXCEPT_SPEC(noex)>        \
+      : public CoreImpl<noex, ReturnType, P...> {                              \
+   public:                                                                     \
+    /*The base class, which contains the datamembers and core operations*/     \
+    using Core = CoreImpl<noex, ReturnType, P...>;                             \
+                                                                               \
+    /*SFINAE constraint to check if F is invocable with the proper signature*/ \
+    template <class F>                                                         \
+    using CallIsValid = True<absl::enable_if_t<absl::disjunction<              \
+        absl::base_internal::is_invocable_r<ReturnType,                        \
+                                            absl::decay_t<F> inv_quals, P...>, \
+        std::is_same<ReturnType,                                               \
+                     absl::base_internal::invoke_result_t<                     \
+                         absl::decay_t<F> inv_quals, P...>>>::value>>;         \
+                                                                               \
+    /*SFINAE constraint to check if F is nothrow-invocable when necessary*/    \
+    template <class F>                                                         \
+    using CallIsNoexceptIfSigIsNoexcept =                                      \
+        True<ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT(inv_quals,        \
+                                                             noex)>;           \
+                                                                               \
+    /*Put the AnyInvocable into an empty state.*/                              \
+    Impl() = default;                                                          \
+                                                                               \
+    /*The implementation of a conversion-constructor from "f*/                 \
+    /*This forwards to Core, attaching inv_quals so that the base class*/      \
+    /*knows how to properly type-erase the invocation.*/                       \
+    template <class F>                                                         \
+    explicit Impl(ConversionConstruct, F&& f)                                  \
+        : Core(TypedConversionConstruct<                                       \
+                   typename std::decay<F>::type inv_quals>(),                  \
+               std::forward<F>(f)) {}                                          \
+                                                                               \
+    /*Forward along the in-place construction parameters.*/                    \
+    template <class T, class... Args>                                          \
+    explicit Impl(absl::in_place_type_t<T>, Args&&... args)                    \
+        : Core(absl::in_place_type<absl::decay_t<T> inv_quals>,                \
+               std::forward<Args>(args)...) {}                                 \
+                                                                               \
+    /*The actual invocation operation with the proper signature*/              \
+    ReturnType operator()(P... args) cv ref noexcept(noex) {                   \
+      assert(this->invoker_ != nullptr);                                       \
+      return this->invoker_(const_cast<TypeErasedState*>(&this->state_),       \
+                            static_cast<ForwardedParameterType<P>>(args)...);  \
+    }                                                                          \
+  }
+
+// Define the `noexcept(true)` specialization only for C++17 and beyond, when
+// `noexcept` is part of the type system.
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+// A convenience macro that defines specializations for the noexcept(true) and
+// noexcept(false) forms, given the other properties.
+#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL(cv, ref, inv_quals)    \
+  ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, false); \
+  ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, true)
+#else
+#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL(cv, ref, inv_quals) \
+  ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, false)
+#endif
+
+// Non-ref-qualified partial specializations
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, , &);
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, , const&);
+
+// Lvalue-ref-qualified partial specializations
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, &, &);
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, &, const&);
+
+// Rvalue-ref-qualified partial specializations
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, &&, &&);
+ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, &&, const&&);
+
+// Undef the detail-only macros.
+#undef ABSL_INTERNAL_ANY_INVOCABLE_IMPL
+#undef ABSL_INTERNAL_ANY_INVOCABLE_IMPL_
+#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_false
+#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_true
+#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT
+#undef ABSL_INTERNAL_NOEXCEPT_SPEC
+
+}  // namespace internal_any_invocable
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_
diff --git a/absl/random/internal/explicit_seed_seq_test.cc b/absl/random/internal/explicit_seed_seq_test.cc
index f867f61..e36d5fa 100644
--- a/absl/random/internal/explicit_seed_seq_test.cc
+++ b/absl/random/internal/explicit_seed_seq_test.cc
@@ -140,10 +140,8 @@
     ExplicitSeedSeq seq_copy(seq_from_entropy);
     EXPECT_EQ(seq_copy.size(), seq_from_entropy.size());
 
-    std::vector<uint32_t> seeds_1;
-    seeds_1.resize(1000, 0);
-    std::vector<uint32_t> seeds_2;
-    seeds_2.resize(1000, 1);
+    std::vector<uint32_t> seeds_1(1000, 0);
+    std::vector<uint32_t> seeds_2(1000, 1);
 
     seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
     seq_copy.generate(seeds_2.begin(), seeds_2.end());
@@ -157,10 +155,8 @@
     }
     ExplicitSeedSeq another_seq(std::begin(entropy), std::end(entropy));
 
-    std::vector<uint32_t> seeds_1;
-    seeds_1.resize(1000, 0);
-    std::vector<uint32_t> seeds_2;
-    seeds_2.resize(1000, 0);
+    std::vector<uint32_t> seeds_1(1000, 0);
+    std::vector<uint32_t> seeds_2(1000, 0);
 
     seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
     another_seq.generate(seeds_2.begin(), seeds_2.end());
@@ -169,7 +165,15 @@
     EXPECT_THAT(seeds_1, Not(Pointwise(Eq(), seeds_2)));
 
     // Apply the assignment-operator.
+    // GCC 12 has a false-positive -Wstringop-overflow warning here.
+#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstringop-overflow"
+#endif
     another_seq = seq_from_entropy;
+#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
+#pragma GCC diagnostic pop
+#endif
 
     // Re-generate seeds.
     seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
@@ -181,15 +185,13 @@
   // Move constructor.
   {
     // Get seeds from seed-sequence constructed from entropy.
-    std::vector<uint32_t> seeds_1;
-    seeds_1.resize(1000, 0);
+    std::vector<uint32_t> seeds_1(1000, 0);
     seq_from_entropy.generate(seeds_1.begin(), seeds_1.end());
 
     // Apply move-constructor move the sequence to another instance.
     absl::random_internal::ExplicitSeedSeq moved_seq(
         std::move(seq_from_entropy));
-    std::vector<uint32_t> seeds_2;
-    seeds_2.resize(1000, 1);
+    std::vector<uint32_t> seeds_2(1000, 1);
     moved_seq.generate(seeds_2.begin(), seeds_2.end());
     // Verify that seeds produced by moved-instance are the same as original.
     EXPECT_THAT(seeds_1, Pointwise(Eq(), seeds_2));
diff --git a/absl/types/any_test.cc b/absl/types/any_test.cc
index 70e4ba2..d382b92 100644
--- a/absl/types/any_test.cc
+++ b/absl/types/any_test.cc
@@ -754,26 +754,23 @@
 
 // Test the guarantees regarding exceptions in emplace.
 TEST(AnyTest, FailedEmplace) {
-  {
-    BadCopyable bad;
-    absl::any target;
-    ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad));
-  }
+  BadCopyable bad;
+  absl::any target;
+  ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad));
+}
 
-  {
-    BadCopyable bad;
-    absl::any target(absl::in_place_type<int>);
-    ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad));
-#if defined(ABSL_USES_STD_ANY) && defined(__GLIBCXX__)
-    // libstdc++ std::any::emplace() implementation (as of 7.2) has a bug: if an
-    // exception is thrown, *this contains a value.
-#define ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG 1
+// GCC and Clang have a bug here.
+// Ine some cases, the exception seems to be thrown at the wrong time, and
+// target may contain a value.
+#ifdef __GNUC__
+TEST(AnyTest, DISABLED_FailedEmplaceInPlace) {
+#else
+TEST(AnyTest, FailedEmplaceInPlace) {
 #endif
-#if defined(ABSL_HAVE_EXCEPTIONS) && \
-    !defined(ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG)
-    EXPECT_FALSE(target.has_value());
-#endif
-  }
+  BadCopyable bad;
+  absl::any target(absl::in_place_type<int>);
+  ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad));
+  EXPECT_FALSE(target.has_value());
 }
 
 }  // namespace
diff --git a/ci/cmake_common.sh b/ci/cmake_common.sh
index 8a93389..372038a 100644
--- a/ci/cmake_common.sh
+++ b/ci/cmake_common.sh
@@ -14,7 +14,7 @@
 
 # The commit of GoogleTest to be used in the CMake tests in this directory.
 # Keep this in sync with the commit in the WORKSPACE file.
-readonly ABSL_GOOGLETEST_COMMIT="28e1da21d8d677bc98f12ccc7fc159ff19e8e817"
+readonly ABSL_GOOGLETEST_COMMIT="86add13493e5c881d7e4ba77fb91c1f57752b3a4"
 
 # Avoid depending on GitHub by looking for a cached copy of the commit first.
 if [[ -r "${KOKORO_GFILE_DIR:-}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" ]]; then