diff options
author | Eric Fiselier <eric@efcs.ca> | 2015-05-20 03:15:01 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2015-05-20 03:15:01 +0000 |
commit | 1f294fd934c17ec9836cbde8293d3c51974cdb05 (patch) | |
tree | 1b04d601869e2b6ac114d3f79c5b3f9ce7abea16 /libcxx | |
parent | b0c5df902ef544f55addeeee1245e27934ce6e98 (diff) | |
download | bcm5719-llvm-1f294fd934c17ec9836cbde8293d3c51974cdb05.tar.gz bcm5719-llvm-1f294fd934c17ec9836cbde8293d3c51974cdb05.zip |
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
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/cmake/Modules/HandleLibCXXABI.cmake | 2 | ||||
-rw-r--r-- | libcxx/include/exception | 4 | ||||
-rw-r--r-- | libcxx/include/ratio | 7 | ||||
-rw-r--r-- | libcxx/src/exception.cpp | 2 |
4 files changed, 9 insertions, 6 deletions
diff --git a/libcxx/cmake/Modules/HandleLibCXXABI.cmake b/libcxx/cmake/Modules/HandleLibCXXABI.cmake index ac426979419..73723e3559b 100644 --- a/libcxx/cmake/Modules/HandleLibCXXABI.cmake +++ b/libcxx/cmake/Modules/HandleLibCXXABI.cmake @@ -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. set(CXXABI_LIBNAME "c++abi") endif() - setup_abi_lib("" + setup_abi_lib("-DLIBCXX_BUILDING_LIBCXXABI" ${CXXABI_LIBNAME} "cxxabi.h;__cxxabi_config.h" "" ) elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt") diff --git a/libcxx/include/exception b/libcxx/include/exception index 2d8c0f541d7..ef2b969b742 100644 --- a/libcxx/include/exception +++ b/libcxx/include/exception @@ -193,7 +193,7 @@ 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 +#if _LIBCPP_STD_VER > 11 && __has_feature(is_final) && !is_final<typename remove_reference<_Tp>::type>::value #endif >::type* = 0) @@ -215,7 +215,7 @@ 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 +#if _LIBCPP_STD_VER > 11 && __has_feature(is_final) || is_final<typename remove_reference<_Tp>::type>::value #endif >::type* = 0) diff --git a/libcxx/include/ratio b/libcxx/include/ratio index 6ddc19bf3e3..f623a062f2c 100644 --- a/libcxx/include/ratio +++ b/libcxx/include/ratio @@ -247,8 +247,11 @@ public: 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> const intmax_t ratio<_Num, _Den>::den; +template <intmax_t _Num, intmax_t _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 <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {}; diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp index 07983cea4e2..98b7b441b52 100644 --- a/libcxx/src/exception.cpp +++ b/libcxx/src/exception.cpp @@ -29,7 +29,7 @@ #define __terminate_handler __cxxabiapple::__cxa_terminate_handler #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler #endif // _LIBCPPABI_VERSION -#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) +#elif defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI) || __has_include(<cxxabi.h>) #include <cxxabi.h> using namespace __cxxabiv1; #if defined(LIBCXXRT) || defined(_LIBCPPABI_VERSION) |