[libcxx-commits] [PATCH] D85035: [libc++] Avoid including <Block.h> from <functional>
Louis Dionne via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jul 31 10:06:37 PDT 2020
ldionne created this revision.
ldionne added a reviewer: erik.pilkington.
Herald added subscribers: libcxx-commits, dexonsmith, jkorous.
Herald added a project: libc++.
Herald added a reviewer: libc++.
ldionne requested review of this revision.
Block.h is a pretty common name, which can lead to nasty collisions with
user provided headers. Since we're only getting a few simple declarations
from the header, it's better to declare them manually than to include the
header.
rdar://66384326
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D85035
Files:
libcxx/include/functional
libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp
Index: libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp
===================================================================
--- libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp
+++ libcxx/test/libcxx/utilities/function.objects/func.blocks.sh.cpp
@@ -21,6 +21,8 @@
#include <cstdlib>
#include <cassert>
+#include <Block.h>
+
#include "test_macros.h"
#include "count_new.h"
Index: libcxx/include/functional
===================================================================
--- libcxx/include/functional
+++ libcxx/include/functional
@@ -508,10 +508,6 @@
#include <__functional_base>
-#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME) && !defined(_LIBCPP_HAS_OBJC_ARC)
-#include <Block.h>
-#endif
-
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif
@@ -2257,6 +2253,9 @@
#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME) && !defined(_LIBCPP_HAS_OBJC_ARC)
+extern "C" void *_Block_copy(const void *);
+extern "C" void _Block_release(const void *);
+
template<class _Rp1, class ..._ArgTypes1, class _Alloc, class _Rp, class ..._ArgTypes>
class __func<_Rp1(^)(_ArgTypes1...), _Alloc, _Rp(_ArgTypes...)>
: public __base<_Rp(_ArgTypes...)>
@@ -2267,14 +2266,14 @@
public:
_LIBCPP_INLINE_VISIBILITY
explicit __func(__block_type const& __f)
- : __f_(__f ? Block_copy(__f) : (__block_type)0)
+ : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr))
{ }
// [TODO] add && to save on a retain
_LIBCPP_INLINE_VISIBILITY
explicit __func(__block_type __f, const _Alloc& /* unused */)
- : __f_(__f ? Block_copy(__f) : (__block_type)0)
+ : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr))
{ }
virtual __base<_Rp(_ArgTypes...)>* __clone() const {
@@ -2291,7 +2290,7 @@
virtual void destroy() _NOEXCEPT {
if (__f_)
- Block_release(__f_);
+ _Block_release(__f_);
__f_ = 0;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85035.282255.patch
Type: text/x-patch
Size: 1998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20200731/768170ce/attachment.bin>
More information about the libcxx-commits
mailing list