Fix a corner case that involved calling rethrow_if_nested with a type that had a deleted operator&. Added a test to catch this as well. Thanks to Ville for the heads-up.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@255517 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -77,57 +77,6 @@ struct _LIBCPP_TYPE_VIS_ONLY less<void>
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// addressof
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
_Tp*
|
|
||||||
addressof(_Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return (_Tp*)&reinterpret_cast<const volatile char&>(__x);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
|
|
||||||
// Objective-C++ Automatic Reference Counting uses qualified pointers
|
|
||||||
// that require special addressof() signatures. When
|
|
||||||
// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
|
|
||||||
// itself is providing these definitions. Otherwise, we provide them.
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__strong _Tp*
|
|
||||||
addressof(__strong _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__weak _Tp*
|
|
||||||
addressof(__weak _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__autoreleasing _Tp*
|
|
||||||
addressof(__autoreleasing _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__unsafe_unretained _Tp*
|
|
||||||
addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// __weak_result_type
|
// __weak_result_type
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ rethrow_if_nested(const _Ep& __e, typename enable_if<
|
|||||||
is_polymorphic<_Ep>::value
|
is_polymorphic<_Ep>::value
|
||||||
>::type* = 0)
|
>::type* = 0)
|
||||||
{
|
{
|
||||||
const nested_exception* __nep = dynamic_cast<const nested_exception*>(&__e);
|
const nested_exception* __nep = dynamic_cast<const nested_exception*>(_VSTD::addressof(__e));
|
||||||
if (__nep)
|
if (__nep)
|
||||||
__nep->rethrow_nested();
|
__nep->rethrow_nested();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,13 @@ public:
|
|||||||
B(const B& b) : A(b) {}
|
B(const B& b) : A(b) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class C
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~C() {}
|
||||||
|
C * operator&() const { assert(false); } // should not be called
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -79,7 +86,7 @@ int main()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::rethrow_if_nested(1);
|
std::rethrow_if_nested(C());
|
||||||
assert(true);
|
assert(true);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@@ -87,4 +94,5 @@ int main()
|
|||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user