Tested on x86_64-linux-gnu.
Thanks!
--
Regards,
Tim Shen
commit 69c72d9bb802fd5e4f2704f0fe8a041f8b26d8bd
Author: Tim Shen
Date: Mon Nov 21 21:29:13 2016 -0800
2016-11-22 Tim Shen
PR libstdc++/78441
* include/std/variant: Propagate cv qualifications to types returned
by variant_alternative.
* testsuite/20_util/variant/compile.cc: Tests.
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index 7d93575..34ad3fd 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -85,6 +85,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using variant_alternative_t =
typename variant_alternative<_Np, _Variant>::type;
+ template
+struct variant_alternative<_Np, const _Variant>
+{ using type = add_const_t>; };
+
+ template
+struct variant_alternative<_Np, volatile _Variant>
+{ using type = add_volatile_t>; };
+
+ template
+struct variant_alternative<_Np, const volatile _Variant>
+{ using type = add_cv_t>; };
+
constexpr size_t variant_npos = -1;
_GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc b/libstdc++-v3/testsuite/20_util/variant/compile.cc
index 2470bcc..e3330be 100644
--- a/libstdc++-v3/testsuite/20_util/variant/compile.cc
+++ b/libstdc++-v3/testsuite/20_util/variant/compile.cc
@@ -330,3 +330,12 @@ void test_adl()
variant v8{allocator_arg, a, in_place_type, il, x};
variant v9{allocator_arg, a, in_place_type, 1};
}
+
+void test_variant_alternative() {
+ static_assert(is_same_v>, int>, "");
+ static_assert(is_same_v>, string>, "");
+
+ static_assert(is_same_v>, const int>, "");
+ static_assert(is_same_v>, volatile int>, "");
+ static_assert(is_same_v>, const volatile int>, "");
+}