Fix building and testing libc++ with GCC.
The changes in src/exception.cpp and cmake/Modules/HandleLibCXXABI.cmake fix a bug when building libc++ with GCC. Because GCC does not support __has_include we need to explicitly tell it that we are building against libc++abi via the preprocessor definition `LIBCXX_BUILDING_LIBCXXABI`. The changes in include/ratio are to work around CWG defect 1712 (constexpr variable template declarations). GCC 4.8 and before has not adopted the resolution to this defect. The changes in include/exception work around an issue where is_final is used without it being defined in type_traits. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@237767 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1a7ccb14e8
commit
bae11add65
@ -88,7 +88,7 @@ elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
|
|||||||
# Assume c++abi is installed in the system, rely on -lc++abi link flag.
|
# Assume c++abi is installed in the system, rely on -lc++abi link flag.
|
||||||
set(CXXABI_LIBNAME "c++abi")
|
set(CXXABI_LIBNAME "c++abi")
|
||||||
endif()
|
endif()
|
||||||
setup_abi_lib(""
|
setup_abi_lib("-DLIBCXX_BUILDING_LIBCXXABI"
|
||||||
${CXXABI_LIBNAME} "cxxabi.h;__cxxabi_config.h" ""
|
${CXXABI_LIBNAME} "cxxabi.h;__cxxabi_config.h" ""
|
||||||
)
|
)
|
||||||
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
|
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
|
||||||
|
@ -193,7 +193,7 @@ void
|
|||||||
throw_with_nested(_Tp&& __t, typename enable_if<
|
throw_with_nested(_Tp&& __t, typename enable_if<
|
||||||
is_class<typename remove_reference<_Tp>::type>::value &&
|
is_class<typename remove_reference<_Tp>::type>::value &&
|
||||||
!is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
!is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11 && __has_feature(is_final)
|
||||||
&& !is_final<typename remove_reference<_Tp>::type>::value
|
&& !is_final<typename remove_reference<_Tp>::type>::value
|
||||||
#endif
|
#endif
|
||||||
>::type* = 0)
|
>::type* = 0)
|
||||||
@ -215,7 +215,7 @@ void
|
|||||||
throw_with_nested(_Tp&& __t, typename enable_if<
|
throw_with_nested(_Tp&& __t, typename enable_if<
|
||||||
!is_class<typename remove_reference<_Tp>::type>::value ||
|
!is_class<typename remove_reference<_Tp>::type>::value ||
|
||||||
is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11 && __has_feature(is_final)
|
||||||
|| is_final<typename remove_reference<_Tp>::type>::value
|
|| is_final<typename remove_reference<_Tp>::type>::value
|
||||||
#endif
|
#endif
|
||||||
>::type* = 0)
|
>::type* = 0)
|
||||||
|
@ -247,8 +247,11 @@ public:
|
|||||||
typedef ratio<num, den> type;
|
typedef ratio<num, den> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <intmax_t _Num, intmax_t _Den> const intmax_t ratio<_Num, _Den>::num;
|
template <intmax_t _Num, intmax_t _Den>
|
||||||
template <intmax_t _Num, intmax_t _Den> const intmax_t ratio<_Num, _Den>::den;
|
_LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::num;
|
||||||
|
|
||||||
|
template <intmax_t _Num, intmax_t _Den>
|
||||||
|
_LIBCPP_CONSTEXPR const intmax_t ratio<_Num, _Den>::den;
|
||||||
|
|
||||||
template <class _Tp> struct __is_ratio : false_type {};
|
template <class _Tp> struct __is_ratio : false_type {};
|
||||||
template <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {};
|
template <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {};
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#define __terminate_handler __cxxabiapple::__cxa_terminate_handler
|
#define __terminate_handler __cxxabiapple::__cxa_terminate_handler
|
||||||
#define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
|
#define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
|
||||||
#endif // _LIBCPPABI_VERSION
|
#endif // _LIBCPPABI_VERSION
|
||||||
#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>)
|
#elif defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI) || __has_include(<cxxabi.h>)
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
using namespace __cxxabiv1;
|
using namespace __cxxabiv1;
|
||||||
#if defined(LIBCXXRT) || defined(_LIBCPPABI_VERSION)
|
#if defined(LIBCXXRT) || defined(_LIBCPPABI_VERSION)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user