aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-03-26 14:09:10 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-03-26 14:09:10 +0100
commitaafaa3254ec6fc3d5e3a15a40185950d3af04432 (patch)
treee0689930669e5b7944916b0dea25cd2869b429b2
parent46dbeb4085e4a5492579d06641d0aae25b80b465 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--libstdc++-v3/include/std/variant19
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);