summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2015-05-20 03:15:01 +0000
committerEric Fiselier <eric@efcs.ca>2015-05-20 03:15:01 +0000
commit1f294fd934c17ec9836cbde8293d3c51974cdb05 (patch)
tree1b04d601869e2b6ac114d3f79c5b3f9ce7abea16 /libcxx
parentb0c5df902ef544f55addeeee1245e27934ce6e98 (diff)
downloadbcm5719-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.cmake2
-rw-r--r--libcxx/include/exception4
-rw-r--r--libcxx/include/ratio7
-rw-r--r--libcxx/src/exception.cpp2
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)
OpenPOWER on IntegriCloud