mclow.lists updated this revision to Diff 60651.
mclow.lists added a comment.
@EricWF pointed out that this didn't actually suppress the warning that we were
trying to suppress.
All I can say is that it did several weeks ago when I wrote it. Apparently
clang has gotten pickier.
Use tag dispatch to choose, rather than an if. Same functionality, though.
http://reviews.llvm.org/D21320
Files:
include/memory
Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -2522,6 +2522,13 @@
// default_delete
+template <class _Tp, bool __isArray> struct __do_default_delete;
+template <class _Tp> struct __do_default_delete<_Tp, true>
+{ void operator() (_Tp* __ptr) const _NOEXCEPT { delete [] __ptr; }};
+
+template <class _Tp> struct __do_default_delete<_Tp, false>
+{ void operator() (_Tp* __ptr) const _NOEXCEPT { delete __ptr; }};
+
template <class _Tp>
struct _LIBCPP_TYPE_VIS_ONLY default_delete
{
@@ -2533,11 +2540,13 @@
template <class _Up>
_LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&,
typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0)
_NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
+
+ _LIBCPP_INLINE_VISIBILITY void
+ operator() (_Tp* __ptr) const _NOEXCEPT
{
static_assert(sizeof(_Tp) > 0, "default_delete can not delete
incomplete type");
static_assert(!is_void<_Tp>::value, "default_delete can not delete
incomplete type");
- delete __ptr;
+ __do_default_delete<_Tp, is_array<_Tp>::value>()(__ptr);
}
};
Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -2522,6 +2522,13 @@
// default_delete
+template <class _Tp, bool __isArray> struct __do_default_delete;
+template <class _Tp> struct __do_default_delete<_Tp, true>
+{ void operator() (_Tp* __ptr) const _NOEXCEPT { delete [] __ptr; }};
+
+template <class _Tp> struct __do_default_delete<_Tp, false>
+{ void operator() (_Tp* __ptr) const _NOEXCEPT { delete __ptr; }};
+
template <class _Tp>
struct _LIBCPP_TYPE_VIS_ONLY default_delete
{
@@ -2533,11 +2540,13 @@
template <class _Up>
_LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&,
typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {}
- _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
+
+ _LIBCPP_INLINE_VISIBILITY void
+ operator() (_Tp* __ptr) const _NOEXCEPT
{
static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
static_assert(!is_void<_Tp>::value, "default_delete can not delete incomplete type");
- delete __ptr;
+ __do_default_delete<_Tp, is_array<_Tp>::value>()(__ptr);
}
};
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits