diff --git a/libcxx/include/exception b/libcxx/include/exception --- a/libcxx/include/exception +++ b/libcxx/include/exception @@ -87,6 +87,7 @@ #include <__type_traits/is_copy_constructible.h> #include <__type_traits/is_final.h> #include <__type_traits/is_polymorphic.h> +#include <__utility/forward.h> #include #include #include @@ -313,20 +314,16 @@ _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void __do_throw(_Tp&& __t) { - throw __nested<_Up>(static_cast<_Tp&&>(__t)); + throw __nested<_Up>(std::forward<_Tp>(__t)); } }; template struct __throw_with_nested<_Tp, _Up, false> { _LIBCPP_NORETURN static inline _LIBCPP_INLINE_VISIBILITY void -#ifndef _LIBCPP_CXX03_LANG __do_throw(_Tp&& __t) -#else - __do_throw (_Tp& __t) -#endif // _LIBCPP_CXX03_LANG { - throw static_cast<_Tp&&>(__t); + throw std::forward<_Tp>(__t); } }; #endif @@ -343,7 +340,7 @@ is_class<_Up>::value && !is_base_of::value && !__libcpp_is_final<_Up>::value>:: - __do_throw(static_cast<_Tp&&>(__t)); + __do_throw(std::forward<_Tp>(__t)); #else ((void)__t); // FIXME: Make this abort