Implement std::experimental::fundamentals_v2::propagate_const.
authorVille Voutilainen <ville.voutilainen@gmail.com>
Fri, 3 Jul 2015 14:08:37 +0000 (17:08 +0300)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 3 Jul 2015 14:08:37 +0000 (15:08 +0100)
2015-07-03  Ville Voutilainen  <ville.voutilainen@gmail.com>

Implement std::experimental::fundamentals_v2::propagate_const.
* include/Makefile.am: Add propagate_const.
* include/Makefile.in: Regenerate.
* include/experimental/propagate_const: New.
* testsuite/experimental/propagate_const/assignment/copy.cc: Likewise.
* testsuite/experimental/propagate_const/assignment/move.cc: Likewise.
* testsuite/experimental/propagate_const/assignment/move_neg.cc:
Likewise.
* testsuite/experimental/propagate_const/cons/copy.cc: Likewise.
* testsuite/experimental/propagate_const/cons/default.cc: Likewise.
* testsuite/experimental/propagate_const/cons/move.cc: Likewise.
* testsuite/experimental/propagate_const/cons/move_neg.cc: Likewise.
* testsuite/experimental/propagate_const/hash/1.cc: Likewise.
* testsuite/experimental/propagate_const/observers/1.cc: Likewise.
* testsuite/experimental/propagate_const/relops/1.cc: Likewise.
* testsuite/experimental/propagate_const/requirements1.cc: Likewise.
* testsuite/experimental/propagate_const/requirements2.cc: Likewise.
* testsuite/experimental/propagate_const/requirements3.cc: Likewise.
* testsuite/experimental/propagate_const/requirements4.cc: Likewise.
* testsuite/experimental/propagate_const/requirements5.cc: Likewise.
* testsuite/experimental/propagate_const/swap/1.cc: Likewise.
* testsuite/experimental/propagate_const/typedefs.cc: Likewise.

From-SVN: r225379

21 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/Makefile.am
libstdc++-v3/include/Makefile.in
libstdc++-v3/include/experimental/propagate_const [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/assignment/copy.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/assignment/move.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/cons/copy.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/cons/default.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/cons/move.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/hash/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/observers/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/relops/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/requirements1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/swap/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/experimental/propagate_const/typedefs.cc [new file with mode: 0644]

index b5bc0419dc86ccfa880c597414b7691bae8c743c..fdcfd6186f45891b15c191c3b02ca272d01160bd 100644 (file)
@@ -1,3 +1,28 @@
+2015-07-03  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Implement std::experimental::fundamentals_v2::propagate_const.
+       * include/Makefile.am: Add propagate_const.
+       * include/Makefile.in: Regenerate.
+       * include/experimental/propagate_const: New.
+       * testsuite/experimental/propagate_const/assignment/copy.cc: Likewise.
+       * testsuite/experimental/propagate_const/assignment/move.cc: Likewise.
+       * testsuite/experimental/propagate_const/assignment/move_neg.cc:
+       Likewise.
+       * testsuite/experimental/propagate_const/cons/copy.cc: Likewise.
+       * testsuite/experimental/propagate_const/cons/default.cc: Likewise.
+       * testsuite/experimental/propagate_const/cons/move.cc: Likewise.
+       * testsuite/experimental/propagate_const/cons/move_neg.cc: Likewise.
+       * testsuite/experimental/propagate_const/hash/1.cc: Likewise.
+       * testsuite/experimental/propagate_const/observers/1.cc: Likewise.
+       * testsuite/experimental/propagate_const/relops/1.cc: Likewise.
+       * testsuite/experimental/propagate_const/requirements1.cc: Likewise.
+       * testsuite/experimental/propagate_const/requirements2.cc: Likewise.
+       * testsuite/experimental/propagate_const/requirements3.cc: Likewise.
+       * testsuite/experimental/propagate_const/requirements4.cc: Likewise.
+       * testsuite/experimental/propagate_const/requirements5.cc: Likewise.
+       * testsuite/experimental/propagate_const/swap/1.cc: Likewise.
+       * testsuite/experimental/propagate_const/typedefs.cc: Likewise.
+
 2015-07-02  Jonathan Wakely  <jwakely@redhat.com>
 
        * acinclude.m4 (GLIBCXX_DEFAULT_ABI): Change valid arguments for
index 05be8ad1b84a6ac1f446332c6c3e7348961f69c8..c0028dd324e1d172d3e938246bfd16fb5f5c285a 100644 (file)
@@ -657,6 +657,7 @@ experimental_headers = \
        ${experimental_srcdir}/memory \
        ${experimental_srcdir}/numeric \
        ${experimental_srcdir}/optional \
+       ${experimental_srcdir}/propagate_const \
        ${experimental_srcdir}/ratio \
        ${experimental_srcdir}/set \
        ${experimental_srcdir}/string \
index bab83b40018c8a75b44e4ea078bb2622ef393ca3..24246a65541997d24363f958b188fc855aa150e8 100644 (file)
@@ -946,6 +946,7 @@ experimental_headers = \
        ${experimental_srcdir}/memory \
        ${experimental_srcdir}/numeric \
        ${experimental_srcdir}/optional \
+       ${experimental_srcdir}/propagate_const \
        ${experimental_srcdir}/ratio \
        ${experimental_srcdir}/set \
        ${experimental_srcdir}/string \
diff --git a/libstdc++-v3/include/experimental/propagate_const b/libstdc++-v3/include/experimental/propagate_const
new file mode 100644 (file)
index 0000000..f903959
--- /dev/null
@@ -0,0 +1,535 @@
+// <experimental/propagate_const> -*- C++ -*-
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file experimental/propagate_const
+ *  This is a TS C++ Library header.
+ */
+
+#ifndef _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST
+#define _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST 1
+
+#pragma GCC system_header
+
+#if __cplusplus <= 201103L
+# include <bits/c++14_warning.h>
+#else
+
+#include <type_traits>
+#include <functional>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+namespace experimental
+{
+inline namespace fundamentals_v2
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   * @defgroup propagate_const Const-propagating wrapper
+   * @ingroup experimental
+   *
+   * A const-propagating wrapper that propagates const to pointer-like members,
+   * as described in n4388 "A Proposal to Add a Const-Propagating Wrapper
+   * to the Standard Library".
+   *
+   * @{
+   */
+
+/// Const-propagating wrapper.
+  template <typename _Tp>
+    class propagate_const
+    {
+    public:
+      typedef remove_reference_t<decltype(*declval<_Tp&>())> element_type;
+
+    private:
+      template <typename _Up>
+       struct __is_propagate_const : false_type
+       { };
+
+      template <typename _Up>
+       struct __is_propagate_const<propagate_const<_Up>> : true_type
+       { };
+
+      template <typename _Up>
+       friend constexpr const _Up&
+       get_underlying(const propagate_const<_Up>& __pt) noexcept;
+      template <typename _Up>
+       friend constexpr _Up&
+       get_underlying(propagate_const<_Up>& __pt) noexcept;
+
+      template <typename _Up>
+       static constexpr element_type*
+       __to_raw_pointer(_Up* __u)
+       { return __u; }
+
+      template <typename _Up>
+       static constexpr element_type*
+       __to_raw_pointer(_Up& __u)
+       { return __u.get(); }
+
+      template <typename _Up>
+       static constexpr const element_type*
+       __to_raw_pointer(const _Up* __u)
+       { return __u; }
+
+      template <typename _Up>
+       static constexpr const element_type*
+       __to_raw_pointer(const _Up& __u)
+       { return __u.get(); }
+
+    public:
+      static_assert(__and_<is_object<typename remove_pointer<_Tp>::type>,
+                          __not_<is_array<_Tp>>,
+                          __or_<is_class<_Tp>, is_pointer<_Tp>>>::value,
+                   "propagate_const requires a class or a pointer to an"
+                   " object type");
+
+      // [propagate_const.ctor], constructors
+      constexpr propagate_const() = default;
+      propagate_const(const propagate_const& __p) = delete;
+      constexpr propagate_const(propagate_const&& __p) = default;
+      template <typename _Up, typename
+               enable_if<__and_<is_constructible<_Tp, _Up&&>,
+                                is_convertible<_Up&&, _Tp>>::value, bool
+                         >::type=true>
+      constexpr propagate_const(propagate_const<_Up>&& __pu)
+       : __t(move(get_underlying(__pu)))
+      {}
+      template <typename _Up, typename
+               enable_if<__and_<is_constructible<_Tp, _Up&&>,
+                                __not_<is_convertible<_Up&&, _Tp>>>::value,
+                         bool>::type=false>
+      constexpr explicit propagate_const(propagate_const<_Up>&& __pu)
+       : __t(move(get_underlying(__pu)))
+      {}
+      template <typename _Up, typename
+               enable_if<__and_<is_constructible<_Tp, _Up&&>,
+                                is_convertible<_Up&&, _Tp>,
+                                __not_<__is_propagate_const<
+                                         typename decay<_Up>::type>>
+                                >::value, bool>::type=true>
+      constexpr propagate_const(_Up&& __u)
+       : __t(forward<_Up>(__u))
+      {}
+      template <typename _Up, typename
+               enable_if<__and_<is_constructible<_Tp, _Up&&>,
+                                __not_<is_convertible<_Up&&, _Tp>>,
+                                __not_<__is_propagate_const<
+                                         typename decay<_Up>::type>>
+                                >::value, bool>::type=false>
+      constexpr explicit propagate_const(_Up&& __u)
+       : __t(forward<_Up>(__u))
+      {}
+
+      // [propagate_const.assignment], assignment
+      propagate_const& operator=(const propagate_const& __p) = delete;
+      constexpr propagate_const& operator=(propagate_const&& __p) = default;
+
+      template <typename _Up, typename =
+               typename enable_if<is_convertible<_Up&&, _Tp>::value>::type>
+      constexpr propagate_const& operator=(propagate_const<_Up>&& __pu)
+      {
+       __t = move(get_underlying(__pu));
+      }
+
+      template <typename _Up, typename =
+               typename enable_if<__and_<is_convertible<_Up&&, _Tp>,
+                                         __not_<__is_propagate_const<
+                                                  typename decay<_Up>::type>>
+                                         >::value>::type>
+      constexpr propagate_const& operator=(_Up&& __u)
+      {
+       __t = forward<_Up>(__u);
+      }
+
+      // [propagate_const.const_observers], const observers
+      explicit constexpr operator bool() const
+      {
+       return bool(__t);
+      }
+
+      constexpr const element_type* operator->() const
+      {
+       return get();
+      }
+
+      template <typename _Up = _Tp,
+               typename enable_if<__or_<is_pointer<_Up>,
+                                        is_convertible<_Up,
+                                                       const element_type*>
+                                        >::value, bool>::type = true>
+      constexpr operator const element_type*() const
+      {
+       return get();
+      }
+
+      constexpr const element_type& operator*() const
+      {
+       return *get();
+      }
+
+      constexpr const element_type* get() const
+      {
+       return __to_raw_pointer(__t);
+      }
+
+      // [propagate_const.non_const_observers], non-const observers
+      constexpr element_type* operator->()
+      {
+       return get();
+      }
+
+      template <typename _Up = _Tp,
+               typename enable_if<__or_<is_pointer<_Up>,
+                                        is_convertible<_Up,
+                                                       const element_type*>
+                                        >::value, bool>::type = true>
+      constexpr operator element_type*()
+      {
+       return get();
+      }
+
+      constexpr element_type& operator*()
+      {
+       return *get();
+      }
+
+      constexpr element_type* get()
+      {
+       return __to_raw_pointer(__t);
+      }
+
+      // [propagate_const.modifiers], modifiers
+      constexpr void
+      swap(propagate_const& __pt) noexcept(__is_nothrow_swappable<_Tp>::value)
+      {
+       using std::swap;
+       swap(__t, get_underlying(__pt));
+      }
+
+    private:
+      _Tp __t; //exposition only
+    };
+
+  // [propagate_const.relational], relational operators
+  template <typename _Tp>
+    constexpr bool
+    operator==(const propagate_const<_Tp>& __pt, nullptr_t)
+    {
+      return get_underlying(__pt) == nullptr;
+    }
+
+  template <typename _Tp>
+    constexpr bool
+    operator==(nullptr_t, const propagate_const<_Tp>& __pu)
+    {
+      return nullptr == get_underlying(__pu);
+    }
+
+  template <typename _Tp>
+    constexpr bool
+    operator!=(const propagate_const<_Tp>& __pt, nullptr_t)
+    {
+      return get_underlying(__pt) != nullptr;
+    }
+
+  template <typename _Tp>
+    constexpr bool operator!=(nullptr_t, const propagate_const<_Tp>& __pu)
+    {
+      return nullptr != get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator==(const propagate_const<_Tp>& __pt,
+              const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) == get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator!=(const propagate_const<_Tp>& __pt,
+              const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) != get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<(const propagate_const<_Tp>& __pt,
+             const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) < get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>(const propagate_const<_Tp>& __pt,
+             const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) > get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<=(const propagate_const<_Tp>& __pt,
+              const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) <= get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>=(const propagate_const<_Tp>& __pt,
+              const propagate_const<_Up>& __pu)
+    {
+      return get_underlying(__pt) >= get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator==(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) == __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator!=(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) != __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) < __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) > __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<=(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) <= __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>=(const propagate_const<_Tp>& __pt, const _Up& __u)
+    {
+      return get_underlying(__pt) >= __u;
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator==(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t == get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator!=(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t != get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t < get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t > get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator<=(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t <= get_underlying(__pu);
+    }
+
+  template <typename _Tp, typename _Up>
+    constexpr bool
+    operator>=(const _Tp& __t, const propagate_const<_Up>& __pu)
+    {
+      return __t >= get_underlying(__pu);
+    }
+
+  // [propagate_const.algorithms], specialized algorithms
+  template <typename _Tp>
+    constexpr void
+    swap(propagate_const<_Tp>& __pt, propagate_const<_Tp>& __pt2)
+      noexcept(__is_nothrow_swappable<_Tp>::value)
+    {
+      __pt.swap(__pt2);
+    }
+
+  // [propagate_const.underlying], underlying pointer access
+  template <typename _Tp>
+    constexpr const _Tp&
+    get_underlying(const propagate_const<_Tp>& __pt) noexcept
+    {
+      return __pt.__t;
+    }
+
+  template <typename _Tp>
+    constexpr _Tp&
+    get_underlying(propagate_const<_Tp>& __pt) noexcept
+    {
+      return __pt.__t;
+    }
+
+  // @} group propagate_const
+  _GLIBCXX_END_NAMESPACE_VERSION
+} // namespace fundamentals_v2
+} // namespace experimental
+
+// [propagate_const.hash], hash support
+ template <typename _Tp>
+   struct hash<experimental::propagate_const<_Tp>>
+   {
+     using result_type = size_t;
+     using argument_type = experimental::propagate_const<_Tp>;
+
+     size_t
+     operator()(const experimental::propagate_const<_Tp>& __t) const
+     noexcept(noexcept(hash<_Tp>{}(get_underlying(__t))))
+     {
+       return hash<_Tp>{}(get_underlying(__t));
+     }
+   };
+
+ // [propagate_const.comparison_function_objects], comparison function objects
+ template <typename _Tp>
+   struct equal_to<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return equal_to<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+
+ template <typename _Tp>
+   struct not_equal_to<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return not_equal_to<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+
+ template <typename _Tp>
+   struct less<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return less<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+
+ template <typename _Tp>
+   struct greater<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return greater<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+
+ template <typename _Tp>
+   struct less_equal<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return less_equal<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+
+ template <typename _Tp>
+   struct greater_equal<experimental::propagate_const<_Tp>>
+   {
+     constexpr bool
+     operator()(const experimental::propagate_const<_Tp>& __x,
+               const experimental::propagate_const<_Tp>& __y) const
+     {
+       return greater_equal<_Tp>{}(get_underlying(__x), get_underlying(__y));
+     }
+
+     typedef experimental::propagate_const<_Tp> first_argument_type;
+     typedef experimental::propagate_const<_Tp> second_argument_type;
+     typedef bool result_type;
+   };
+} // namespace std
+
+#endif // C++14
+
+#endif // _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/assignment/copy.cc b/libstdc++-v3/testsuite/experimental/propagate_const/assignment/copy.cc
new file mode 100644 (file)
index 0000000..eb88ee1
--- /dev/null
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+int main()
+{
+  int dummy;
+  propagate_const<int*> test1;
+  propagate_const<int*> test2;
+  test2 = test1; // { dg-error "deleted" }
+  test2 = &dummy;
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move.cc b/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move.cc
new file mode 100644 (file)
index 0000000..73843c5
--- /dev/null
@@ -0,0 +1,47 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+#include <utility>
+#include <memory>
+
+using std::experimental::propagate_const;
+using std::unique_ptr;
+
+int main()
+{
+  const int dummy{42};
+  propagate_const<const int*> test1;
+  test1 = std::move(&dummy);
+  test1 = &dummy;
+  VERIFY(test1.get() == &dummy);
+  propagate_const<const int*> test2;
+  test2 = std::move(test1);
+  VERIFY(test1.get() == &dummy);
+  VERIFY(test2.get() == &dummy);
+  propagate_const<const int*> test3;
+  test3 = std::move(test2);
+  VERIFY(test1.get() == &dummy);
+  VERIFY(test2.get() == &dummy);
+  VERIFY(test3.get() == &dummy);
+  propagate_const<unique_ptr<const int>> test4;
+  test4 = std::make_unique<int>(666);
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc b/libstdc++-v3/testsuite/experimental/propagate_const/assignment/move_neg.cc
new file mode 100644 (file)
index 0000000..cb553e2
--- /dev/null
@@ -0,0 +1,38 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+#include <utility>
+#include <memory>
+
+using std::experimental::propagate_const;
+using std::unique_ptr;
+
+// { dg-error "no type" "" { target *-*-* } 158 }
+
+int main()
+{
+  propagate_const<unique_ptr<const int>> test5;
+  test5 = new int{666}; // { dg-error "no match" }
+  const int* dummy2 = new int{666};
+  propagate_const<unique_ptr<const int>> test6;
+  test6 = dummy2; // { dg-error "no match" }
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/cons/copy.cc b/libstdc++-v3/testsuite/experimental/propagate_const/cons/copy.cc
new file mode 100644 (file)
index 0000000..6f7d99e
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+int main()
+{
+  propagate_const<int*> test1;
+  propagate_const<int*> test2{test1}; // { dg-error "deleted" }
+  propagate_const<int*> test3 = test1; // { dg-error "deleted" }
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/cons/default.cc b/libstdc++-v3/testsuite/experimental/propagate_const/cons/default.cc
new file mode 100644 (file)
index 0000000..8106f69
--- /dev/null
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+
+using std::experimental::propagate_const;
+
+int main()
+{
+  constexpr propagate_const<int*> test1{};
+  static_assert(!test1.get(), "");
+  propagate_const<int*> test2;
+  VERIFY(!test2.get());
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/cons/move.cc b/libstdc++-v3/testsuite/experimental/propagate_const/cons/move.cc
new file mode 100644 (file)
index 0000000..38f495a
--- /dev/null
@@ -0,0 +1,45 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+#include <utility>
+#include <memory>
+
+using std::experimental::propagate_const;
+using std::unique_ptr;
+
+int main()
+{
+  const int dummy{42};
+  propagate_const<const int*> test1{&dummy};
+  VERIFY(test1.get() == &dummy);
+  propagate_const<const int*> test2{std::move(test1)};
+  VERIFY(test1.get() == &dummy);
+  VERIFY(test2.get() == &dummy);
+  propagate_const<const int*> test3{std::move(test2)};
+  VERIFY(test1.get() == &dummy);
+  VERIFY(test2.get() == &dummy);
+  VERIFY(test3.get() == &dummy);
+  propagate_const<unique_ptr<const int>> test4{std::make_unique<int>(666)};
+  propagate_const<unique_ptr<const int>> test5{new int{666}};
+  const int* dummy2 = new int{666};
+  propagate_const<unique_ptr<const int>> test6{dummy2};
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc b/libstdc++-v3/testsuite/experimental/propagate_const/cons/move_neg.cc
new file mode 100644 (file)
index 0000000..caf084d
--- /dev/null
@@ -0,0 +1,42 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+#include <utility>
+#include <memory>
+
+using std::experimental::propagate_const;
+using std::unique_ptr;
+
+// { dg-error "no type" "" { target *-*-* } 117 }
+// { dg-error "no type" "" { target *-*-* } 124 }
+// { dg-error "no type" "" { target *-*-* } 133 }
+// { dg-error "no type" "" { target *-*-* } 142 }
+
+int main()
+{
+  const int dummy{42};
+  propagate_const<const int*> test1{&dummy};
+  propagate_const<int*> test2{&dummy}; // { dg-error "no matching function" }
+  propagate_const<int*> test3{std::move(test1)}; // { dg-error "no matching function" }
+  propagate_const<unique_ptr<const int>> test4 = &dummy; // { dg-error "conversion" }
+  propagate_const<unique_ptr<const int>> test5 = std::move(test1); // { dg-error "conversion" }
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/hash/1.cc b/libstdc++-v3/testsuite/experimental/propagate_const/hash/1.cc
new file mode 100644 (file)
index 0000000..41ebd20
--- /dev/null
@@ -0,0 +1,35 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+
+using std::experimental::propagate_const;
+using std::hash;
+
+int main()
+{
+  int x{42};
+  int y{666};
+  propagate_const<int*> xx{&x};
+  propagate_const<int*> yy{&y};
+  VERIFY(hash<int*>{}(&x) == hash<propagate_const<int*>>{}(xx));
+  VERIFY(hash<int*>{}(&y) == hash<propagate_const<int*>>{}(yy));
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/observers/1.cc b/libstdc++-v3/testsuite/experimental/propagate_const/observers/1.cc
new file mode 100644 (file)
index 0000000..368b660
--- /dev/null
@@ -0,0 +1,65 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+
+using std::experimental::propagate_const;
+using std::hash;
+
+int main()
+{
+  int x{42};
+  propagate_const<int*> xx{&x};
+  VERIFY(bool(xx));
+  propagate_const<int*> xx2{};
+  VERIFY(!bool(xx2));
+  struct X {int x;};
+  X x3{42};
+  propagate_const<X*> xx3{&x3};
+  VERIFY(xx3->x == 42);
+  VERIFY((*xx3).x == 42);
+  VERIFY(xx3.get() == &x3);
+  const propagate_const<X*> xx4{&x3};
+  VERIFY(xx4->x == 42);
+  VERIFY((*xx4).x == 42);
+  VERIFY(xx4.get() == &x3);
+  static constexpr int x4{42};
+  constexpr propagate_const<const int*> xx5{&x4};
+  static_assert(bool(xx5), "");
+  constexpr propagate_const<const int*> xx6{};
+  static_assert(!bool(xx6), "");
+  struct X2 {int x;};
+  static constexpr X2 x5{42};
+  constexpr propagate_const<const X2*> xx7{&x5};
+  static_assert(xx7->x == 42, "");
+  static_assert((*xx7).x == 42, "");
+  static_assert(xx7.get() == &x5, "");
+  struct X3
+  {
+    int f() {return 42;}
+    int f() const {return 666;}
+  };
+  X3 xx8;
+  propagate_const<X3*> xx9{&xx8};
+  const propagate_const<X3*> xx10{&xx8};
+  VERIFY(xx9->f() == 42);
+  VERIFY(xx10->f() == 666);
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/relops/1.cc b/libstdc++-v3/testsuite/experimental/propagate_const/relops/1.cc
new file mode 100644 (file)
index 0000000..eff5df2
--- /dev/null
@@ -0,0 +1,67 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+
+using std::experimental::propagate_const;
+using std::hash;
+
+int main()
+{
+  int x[2];
+  propagate_const<int*> xx1{&x[0]};
+  propagate_const<int*> xx2{&x[1]};
+  VERIFY(xx1 == xx1);
+  VERIFY(xx1 != xx2);
+  VERIFY(xx1 < xx2);
+  VERIFY(xx2 > xx1);
+  VERIFY(xx1 <= xx2);
+  VERIFY(xx2 >= xx1);
+  VERIFY(xx1 <= xx1);
+  VERIFY(xx2 >= xx2);
+  VERIFY(std::equal_to<propagate_const<int*>>{}(xx1, xx1));
+  VERIFY(std::not_equal_to<propagate_const<int*>>{}(xx1, xx2));
+  VERIFY(std::less<propagate_const<int*>>{}(xx1, xx2));
+  VERIFY(std::greater<propagate_const<int*>>{}(xx2, xx1));
+  VERIFY(std::less_equal<propagate_const<int*>>{}(xx1, xx2));
+  VERIFY(std::greater_equal<propagate_const<int*>>{}(xx2, xx1));
+  VERIFY(std::less_equal<propagate_const<int*>>{}(xx1, xx1));
+  VERIFY(std::greater_equal<propagate_const<int*>>{}(xx2, xx2));
+  static constexpr int x2[2]{};
+  constexpr propagate_const<const int*> xx3{&x2[0]};
+  constexpr propagate_const<const int*> xx4{&x2[1]};
+  static_assert(xx3 == xx3, "");
+  static_assert(xx3 != xx4, "");
+  static_assert(xx3 < xx4, "");
+  static_assert(xx4 > xx3, "");
+  static_assert(xx3 <= xx4, "");
+  static_assert(xx4 >= xx3, "");
+  static_assert(xx3 <= xx3, "");
+  static_assert(xx4 >= xx4, "");
+  static_assert(std::equal_to<propagate_const<const int*>>{}(xx3, xx3), "");
+  static_assert(std::not_equal_to<propagate_const<const int*>>{}(xx3, xx4), "");
+  static_assert(std::less<propagate_const<const int*>>{}(xx3, xx4), "");
+  static_assert(std::greater<propagate_const<const int*>>{}(xx4, xx3), "");
+  static_assert(std::less_equal<propagate_const<const int*>>{}(xx3, xx4), "");
+  static_assert(std::greater_equal<propagate_const<const int*>>{}(xx4, xx3), "");
+  static_assert(std::less_equal<propagate_const<const int*>>{}(xx3, xx3), "");
+  static_assert(std::greater_equal<propagate_const<const int*>>{}(xx4, xx4), "");
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements1.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements1.cc
new file mode 100644 (file)
index 0000000..29423e8
--- /dev/null
@@ -0,0 +1,37 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2013-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <memory>
+
+using std::experimental::propagate_const;
+using std::unique_ptr;
+using std::shared_ptr;
+
+propagate_const<int*> test1;
+propagate_const<const int*> test2;
+propagate_const<unique_ptr<int>> test3;
+propagate_const<unique_ptr<const int>> test4;
+propagate_const<const unique_ptr<int>> test5;
+propagate_const<const unique_ptr<const int>> test6;
+propagate_const<shared_ptr<int>> test7;
+propagate_const<shared_ptr<const int>> test8;
+propagate_const<const shared_ptr<int>> test9;
+propagate_const<const shared_ptr<const int>> test10;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc
new file mode 100644 (file)
index 0000000..5f75a31
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 104 }
+// { dg-error "not a pointer-to-object type" "" { target *-*-* } 65 }
+// { dg-error "forming pointer to reference type" "" { target *-*-* } 184 }
+// { dg-error "forming pointer to reference type" "" { target *-*-* } 210 }
+
+propagate_const<void*> test1;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements3.cc
new file mode 100644 (file)
index 0000000..71d6a32
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 104 }
+
+propagate_const<void (*)()> test1;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements4.cc
new file mode 100644 (file)
index 0000000..942b176
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 104 }
+// { dg-error "invalid type" "" { target *-*-* } 65 }
+// { dg-error "uninitialized reference member" "" { target *-*-* } 111 }
+
+propagate_const<int&> test1; // { dg-error "use of deleted function" }
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc b/libstdc++-v3/testsuite/experimental/propagate_const/requirements5.cc
new file mode 100644 (file)
index 0000000..da02386
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+
+using std::experimental::propagate_const;
+
+// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 104 }
+
+propagate_const<int[1]> test1;
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/swap/1.cc b/libstdc++-v3/testsuite/experimental/propagate_const/swap/1.cc
new file mode 100644 (file)
index 0000000..a49b283
--- /dev/null
@@ -0,0 +1,37 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do run }
+
+// Copyright (C) 2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <testsuite_hooks.h>
+
+using std::experimental::propagate_const;
+
+int main()
+{
+  int x{42};
+  int y{666};
+  propagate_const<int*> xx{&x};
+  propagate_const<int*> yy{&y};
+  VERIFY(*xx == 42);
+  VERIFY(*yy == 666);
+  swap(xx, yy);
+  VERIFY(*xx == 666);
+  VERIFY(*yy == 42);
+}
diff --git a/libstdc++-v3/testsuite/experimental/propagate_const/typedefs.cc b/libstdc++-v3/testsuite/experimental/propagate_const/typedefs.cc
new file mode 100644 (file)
index 0000000..d9362c8
--- /dev/null
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++14" }
+// { dg-do compile }
+
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a moved_to of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <experimental/propagate_const>
+#include <type_traits>
+#include <stdexcept>
+
+template <typename T>
+using check1_t = std::experimental::fundamentals_v2::propagate_const<T>;
+template <typename T>
+using check2_t
+= typename std::experimental::fundamentals_v2::propagate_const<T>::element_type;
+
+static_assert(std::is_same<check2_t<int*>, int>::value,
+             "element_type must be based on the pointer");