diff options
| author | Eric Fiselier <eric@efcs.ca> | 2018-03-22 22:32:55 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2018-03-22 22:32:55 +0000 |
| commit | a595456731bc404f78ca4fc220a6249cb9a7184d (patch) | |
| tree | 1a2061c13bdcb7425c4905f54b749e5ff460da57 /libcxx/include/variant | |
| parent | adb173314dd65ef9f84e1d22ec1ac4f2582f3031 (diff) | |
| download | bcm5719-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/variant | 29 |
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 < |

