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 cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits