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:
Marshall Clow 2015-03-16 15:10:28 +00:00
parent eda3fcaaed
commit aa8a52c934
2 changed files with 22 additions and 0 deletions

View File

@ -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<

View File

@ -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
}