diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2018-03-26 14:09:10 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2018-03-26 14:09:10 +0100 |
commit | aafaa3254ec6fc3d5e3a15a40185950d3af04432 (patch) | |
tree | e0689930669e5b7944916b0dea25cd2869b429b2 | |
parent | 46dbeb4085e4a5492579d06641d0aae25b80b465 (diff) | |
download | gcc-aafaa3254ec6fc3d5e3a15a40185950d3af04432.zip gcc-aafaa3254ec6fc3d5e3a15a40185950d3af04432.tar.gz gcc-aafaa3254ec6fc3d5e3a15a40185950d3af04432.tar.bz2 |
Add workaround to std::variant for Clang bug 31852
* include/std/variant (__get): Qualify calls to avoid ADL.
(__select_index): Adjust whitespace.
(variant): Add using-declaration to workaround Clang bug.
From-SVN: r258854
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/variant | 19 |
2 files changed, 20 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5d2620d..bdd4c6b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2018-03-26 Jonathan Wakely <jwakely@redhat.com> + + * include/std/variant (__get): Qualify calls to avoid ADL. + (__select_index): Adjust whitespace. + (variant): Add using-declaration to workaround Clang bug. + 2018-03-22 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/85040 diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index 4aba131..e4ae657 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -223,13 +223,17 @@ namespace __variant template<size_t _Np, typename _Union> constexpr decltype(auto) __get(in_place_index_t<_Np>, _Union&& __u) - { return __get(in_place_index<_Np-1>, std::forward<_Union>(__u)._M_rest); } + { + return __variant::__get(in_place_index<_Np-1>, + std::forward<_Union>(__u)._M_rest); + } // Returns the typed storage for __v. template<size_t _Np, typename _Variant> constexpr decltype(auto) __get(_Variant&& __v) { - return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u); + return __variant::__get(std::in_place_index<_Np>, + std::forward<_Variant>(__v)._M_u); } // Various functions as "vtable" entries, where those vtables are used by @@ -358,10 +362,9 @@ namespace __variant template <typename... _Types> using __select_index = - typename __select_int::_Select_int_base<sizeof...(_Types)+1, + typename __select_int::_Select_int_base<sizeof...(_Types) + 1, unsigned char, - unsigned short> - ::type::value_type; + unsigned short>::type::value_type; template<typename... _Types> struct _Variant_storage<false, _Types...> @@ -1304,6 +1307,12 @@ namespace __variant #undef _VARIANT_RELATION_FUNCTION_TEMPLATE +#ifdef __clang__ + public: + using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852 + private: +#endif + template<size_t _Np, typename _Vp> friend constexpr decltype(auto) __detail::__variant::__get(_Vp&& __v); |