Fix a problem when calling throw_with_nested with a class marked 'final'. Thanks to STL @ Microsoft for the bug report.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@232384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
eda3fcaaed
commit
aa8a52c934
@ -193,6 +193,9 @@ void
|
||||
throw_with_nested(_Tp&& __t, typename enable_if<
|
||||
is_class<typename remove_reference<_Tp>::type>::value &&
|
||||
!is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
&& !is_final<typename remove_reference<_Tp>::type>::value
|
||||
#endif
|
||||
>::type* = 0)
|
||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
throw_with_nested (_Tp& __t, typename enable_if<
|
||||
@ -212,6 +215,9 @@ void
|
||||
throw_with_nested(_Tp&& __t, typename enable_if<
|
||||
!is_class<typename remove_reference<_Tp>::type>::value ||
|
||||
is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|| is_final<typename remove_reference<_Tp>::type>::value
|
||||
#endif
|
||||
>::type* = 0)
|
||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
throw_with_nested (_Tp& __t, typename enable_if<
|
||||
|
@ -36,6 +36,10 @@ public:
|
||||
friend bool operator==(const B& x, const B& y) {return x.data_ == y.data_;}
|
||||
};
|
||||
|
||||
#if __cplusplus > 201103L
|
||||
struct Final final {};
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
@ -100,4 +104,16 @@ int main()
|
||||
assert(i == 7);
|
||||
}
|
||||
}
|
||||
#if __cplusplus > 201103L
|
||||
{
|
||||
try
|
||||
{
|
||||
std::throw_with_nested(Final());
|
||||
assert(false);
|
||||
}
|
||||
catch (const Final &f)
|
||||
{
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user