diff mbox

Propagate cv qualifications in variant_alternative

Message ID CAG4ZjNnSz0iHH63OLxieA3F+KUJ3-fhjLf18poPAQHnE=dZrrQ@mail.gmail.com
State New
Headers show

Commit Message

Tim Shen Nov. 22, 2016, 6:46 a.m. UTC
Tested on x86_64-linux-gnu.

Thanks!


-- 
Regards,
Tim Shen

Comments

Jonathan Wakely Nov. 22, 2016, 1:38 p.m. UTC | #1
On 21/11/16 22:46 -0800, Tim Shen wrote:
>    	PR libstdc++/78441

>    	* include/std/variant: Propagate cv qualifications to types returned

>    	by variant_alternative.

>    	* testsuite/20_util/variant/compile.cc: Tests.


OK for trunk, thanks.
diff mbox

Patch

commit 69c72d9bb802fd5e4f2704f0fe8a041f8b26d8bd
Author: Tim Shen <timshen@google.com>
Date:   Mon Nov 21 21:29:13 2016 -0800

    2016-11-22  Tim Shen  <timshen@google.com>
    
    	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<size_t _Np, typename _Variant>
+    struct variant_alternative<_Np, const _Variant>
+    { using type = add_const_t<variant_alternative_t<_Np, _Variant>>; };
+
+  template<size_t _Np, typename _Variant>
+    struct variant_alternative<_Np, volatile _Variant>
+    { using type = add_volatile_t<variant_alternative_t<_Np, _Variant>>; };
+
+  template<size_t _Np, typename _Variant>
+    struct variant_alternative<_Np, const volatile _Variant>
+    { using type = add_cv_t<variant_alternative_t<_Np, _Variant>>; };
+
   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<X> v8{allocator_arg, a, in_place_type<X>, il, x};
    variant<X> v9{allocator_arg, a, in_place_type<X>, 1};
 }
+
+void test_variant_alternative() {
+  static_assert(is_same_v<variant_alternative_t<0, variant<int, string>>, int>, "");
+  static_assert(is_same_v<variant_alternative_t<1, variant<int, string>>, string>, "");
+
+  static_assert(is_same_v<variant_alternative_t<0, const variant<int>>, const int>, "");
+  static_assert(is_same_v<variant_alternative_t<0, volatile variant<int>>, volatile int>, "");
+  static_assert(is_same_v<variant_alternative_t<0, const volatile variant<int>>, const volatile int>, "");
+}