summaryrefslogtreecommitdiffstats
path: root/libcxx/include/variant
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2018-03-22 22:32:55 +0000
committerEric Fiselier <eric@efcs.ca>2018-03-22 22:32:55 +0000
commita595456731bc404f78ca4fc220a6249cb9a7184d (patch)
tree1a2061c13bdcb7425c4905f54b749e5ff460da57 /libcxx/include/variant
parentadb173314dd65ef9f84e1d22ec1ac4f2582f3031 (diff)
downloadbcm5719-llvm-a595456731bc404f78ca4fc220a6249cb9a7184d.tar.gz
bcm5719-llvm-a595456731bc404f78ca4fc220a6249cb9a7184d.zip
Workaround GCC bug PR78489 - SFINAE order is not respected.
This patch works around variant test failures which are new to GCC 8. GCC 8 either doesn't perform SFINAE in lexical order, or it doesn't halt after encountering the first failure. This causes hard error to occur instead of substitution failure. See gcc.gnu.org/PR78489 llvm-svn: 328261
Diffstat (limited to 'libcxx/include/variant')
-rw-r--r--libcxx/include/variant29
1 files changed, 12 insertions, 17 deletions
diff --git a/libcxx/include/variant b/libcxx/include/variant
index f9098f42249..6f78e2de157 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -1156,29 +1156,24 @@ public:
: __impl(in_place_index<_Ip>, _VSTD::forward<_Arg>(__arg)) {}
template <size_t _Ip, class... _Args,
- class = enable_if_t<(_Ip < sizeof...(_Types)), int>,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
- enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
+ enable_if_t<(_Ip < sizeof...(_Types)), size_t> _Ip2 = _Ip,
+ class _Tp = variant_alternative_t<_Ip2, variant<_Types...>>,
+ enable_if_t<is_constructible<_Tp, _Args...>::value, int> = 0>
inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(
- in_place_index_t<_Ip>,
- _Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
+ explicit constexpr variant(in_place_index_t<_Ip>,
+ _Args&&... __args)
+ noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
: __impl(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...) {}
- template <
- size_t _Ip,
- class _Up,
- class... _Args,
- enable_if_t<(_Ip < sizeof...(_Types)), int> = 0,
- class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
+ template <size_t _Ip, class _Up, class... _Args,
+ enable_if_t<(_Ip < sizeof...(_Types)), size_t> _Ip2 = _Ip,
+ class _Tp = variant_alternative_t<_Ip2, variant<_Types...>>,
enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
int> = 0>
inline _LIBCPP_INLINE_VISIBILITY
- explicit constexpr variant(
- in_place_index_t<_Ip>,
- initializer_list<_Up> __il,
- _Args&&... __args) noexcept(
- is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
+ explicit constexpr variant(in_place_index_t<_Ip>, initializer_list<_Up> __il,
+ _Args&&... __args)
+ noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
: __impl(in_place_index<_Ip>, __il, _VSTD::forward<_Args>(__args)...) {}
template <
OpenPOWER on IntegriCloud