From c5c4db4f5191fe5e76cbf68dcc71fb28702f7d2b Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Mon, 5 Aug 2019 11:32:04 -0700 Subject: Export of internal Abseil changes -- f8fe0f483378c7520d8f8bdfabe4b20de4d96c7e by Andy Soffer : Ensure that Invoke can support C++17 in the sense that noexcept is part of the type. PiperOrigin-RevId: 261730155 -- bf796ab71653a80498f9374bc8c5111d065c64ba by Abseil Team : Fix typo in static_assert message for copy/move constructible by replacing "by" with "be". PiperOrigin-RevId: 261713992 -- 8c7c17c40d03a322f304a2fd73ed34462dbf265a by Andy Soffer : Add absl::is_function drop-in replacement for std::is_function. Some standard libraries incorrectly implement std::is_function in a few corner cases. In particular, libstdc++ functions marked noexcept. The trick being used here is that function types decay to pointers. After excluding cases like is_class, etc, we can distinguish function types by testing for this decay. Many thanks to ericwf@ for essentially writing this CL. PiperOrigin-RevId: 261705008 -- c5adf42d0a132c2525d17a719329eab2ffe0aa94 by Abseil Team : Add microbenchmark for StrSplit that uses delimiter ByAnyChar. PiperOrigin-RevId: 261424010 -- 66a342f9381ec56be2fe3aa5b3193dd3538a9740 by Andy Soffer : CMake support for Abseil Random This change touches almost build-related files for CMake almost exclusively. The one minor exception is random/internal/salted_seed_seq.h. The default warnings configuration for one of our CI builds requests not having named but unused parameters. The change in this file cleans up that warning. PiperOrigin-RevId: 261192369 GitOrigin-RevId: f8fe0f483378c7520d8f8bdfabe4b20de4d96c7e Change-Id: I05f662baacfe78750651535aa658f61c2327bc44 --- absl/base/internal/invoke.h | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) (limited to 'absl/base/internal') diff --git a/absl/base/internal/invoke.h b/absl/base/internal/invoke.h index 8da2869afbd7..44f13302f434 100644 --- a/absl/base/internal/invoke.h +++ b/absl/base/internal/invoke.h @@ -39,6 +39,8 @@ #include #include +#include "absl/meta/type_traits.h" + // The following code is internal implementation detail. See the comment at the // top of this file for the API documentation. @@ -67,15 +69,11 @@ struct MemFunAndRef : StrippedAccept { template struct AcceptImpl : std::false_type {}; - template - struct AcceptImpl - : std::is_base_of {}; - - template - struct AcceptImpl - : std::is_base_of {}; + template + struct AcceptImpl + : std::integral_constant::value && + absl::is_function::value> { + }; template static decltype((std::declval().* @@ -92,15 +90,11 @@ struct MemFunAndPtr : StrippedAccept { template struct AcceptImpl : std::false_type {}; - template - struct AcceptImpl - : std::integral_constant::value> {}; - - template - struct AcceptImpl - : std::integral_constant::value> {}; + template + struct AcceptImpl + : std::integral_constant::value && + absl::is_function::value> { + }; template static decltype(((*std::declval()).* @@ -119,7 +113,9 @@ struct DataMemAndRef : StrippedAccept { struct AcceptImpl : std::false_type {}; template - struct AcceptImpl : std::is_base_of {}; + struct AcceptImpl + : std::integral_constant::value && + !absl::is_function::value> {}; template static decltype(std::declval().*std::declval()) Invoke( @@ -136,7 +132,8 @@ struct DataMemAndPtr : StrippedAccept { template struct AcceptImpl - : std::integral_constant::value> {}; + : std::integral_constant::value && + !absl::is_function::value> {}; template static decltype((*std::declval()).*std::declval()) Invoke( -- cgit 1.4.1