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.

llvm-svn: 237767
This commit is contained in:
Eric Fiselier 2015-05-20 03:15:01 +00:00
parent b0c5df902e
commit 1f294fd934
4 changed files with 9 additions and 6 deletions

View File

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

View File

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

View File

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

View File

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