1 // { dg-do run { target c++14 } }
2 
3 // Copyright (C) 2015-2019 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3.  If not see
18 // <http://www.gnu.org/licenses/>.
19 
20 #include <experimental/propagate_const>
21 #include <testsuite_hooks.h>
22 
23 using std::experimental::propagate_const;
24 using std::hash;
25 
main()26 int main()
27 {
28   int x[2];
29   propagate_const<int*> xx1{&x[0]};
30   propagate_const<int*> xx2{&x[1]};
31   VERIFY(xx1 == xx1);
32   VERIFY(xx1 != xx2);
33   VERIFY(xx1 < xx2);
34   VERIFY(xx2 > xx1);
35   VERIFY(xx1 <= xx2);
36   VERIFY(xx2 >= xx1);
37   VERIFY(xx1 <= xx1);
38   VERIFY(xx2 >= xx2);
39   VERIFY(std::equal_to<propagate_const<int*>>{}(xx1, xx1));
40   VERIFY(std::not_equal_to<propagate_const<int*>>{}(xx1, xx2));
41   VERIFY(std::less<propagate_const<int*>>{}(xx1, xx2));
42   VERIFY(std::greater<propagate_const<int*>>{}(xx2, xx1));
43   VERIFY(std::less_equal<propagate_const<int*>>{}(xx1, xx2));
44   VERIFY(std::greater_equal<propagate_const<int*>>{}(xx2, xx1));
45   VERIFY(std::less_equal<propagate_const<int*>>{}(xx1, xx1));
46   VERIFY(std::greater_equal<propagate_const<int*>>{}(xx2, xx2));
47   static constexpr int x2[2]{};
48   constexpr propagate_const<const int*> xx3{&x2[0]};
49   constexpr propagate_const<const int*> xx4{&x2[1]};
50   static_assert(xx3 == xx3, "");
51   static_assert(xx3 != xx4, "");
52   static_assert(xx3 < xx4, "");
53   static_assert(xx4 > xx3, "");
54   static_assert(xx3 <= xx4, "");
55   static_assert(xx4 >= xx3, "");
56   static_assert(xx3 <= xx3, "");
57   static_assert(xx4 >= xx4, "");
58   static_assert(std::equal_to<propagate_const<const int*>>{}(xx3, xx3), "");
59   static_assert(std::not_equal_to<propagate_const<const int*>>{}(xx3, xx4), "");
60   static_assert(std::less<propagate_const<const int*>>{}(xx3, xx4), "");
61   static_assert(std::greater<propagate_const<const int*>>{}(xx4, xx3), "");
62   static_assert(std::less_equal<propagate_const<const int*>>{}(xx3, xx4), "");
63   static_assert(std::greater_equal<propagate_const<const int*>>{}(xx4, xx3), "");
64   static_assert(std::less_equal<propagate_const<const int*>>{}(xx3, xx3), "");
65   static_assert(std::greater_equal<propagate_const<const int*>>{}(xx4, xx4), "");
66 }
67