1 
2 // Copyright 2017, 2019 Peter Dimov
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 //
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8 
9 #include <boost/variant2/variant.hpp>
10 using namespace boost::variant2;
11 
12 #if !defined(BOOST_MP11_HAS_CXX14_CONSTEXPR)
13 
14 #include <boost/config/pragma_message.hpp>
15 
16 BOOST_PRAGMA_MESSAGE("Skipping constexpr op==, op!= test because BOOST_MP11_HAS_CXX14_CONSTEXPR is not defined")
17 
main()18 int main() {}
19 
20 #else
21 
22 struct X
23 {
24 };
25 
operator ==(X const &,X const &)26 inline constexpr bool operator==( X const&, X const& ) { return false; }
operator !=(X const &,X const &)27 inline constexpr bool operator!=( X const&, X const& ) { return false; }
28 
29 #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
30 
main()31 int main()
32 {
33     {
34         constexpr variant<int> v1, v2, v3( 1 ), v4( 1 );
35 
36         STATIC_ASSERT( v1 == v2 );
37         STATIC_ASSERT( !(v1 != v2) );
38 
39         STATIC_ASSERT( v1 != v3 );
40         STATIC_ASSERT( !(v1 == v3) );
41 
42         STATIC_ASSERT( v3 == v4 );
43         STATIC_ASSERT( !(v3 != v4) );
44     }
45 
46     {
47         constexpr variant<int, float> v1, v2, v3( 1 ), v4( 1 ), v5( 3.14f ), v6( 3.14f );
48 
49         STATIC_ASSERT( v1 == v2 );
50         STATIC_ASSERT( !(v1 != v2) );
51 
52         STATIC_ASSERT( v1 != v3 );
53         STATIC_ASSERT( !(v1 == v3) );
54 
55         STATIC_ASSERT( v3 == v4 );
56         STATIC_ASSERT( !(v3 != v4) );
57 
58         STATIC_ASSERT( v1 != v5 );
59         STATIC_ASSERT( !(v1 == v5) );
60 
61         STATIC_ASSERT( v3 != v5 );
62         STATIC_ASSERT( !(v3 == v5) );
63 
64         STATIC_ASSERT( v5 == v6 );
65         STATIC_ASSERT( !(v5 != v6) );
66     }
67 
68     {
69         constexpr variant<int, int, float> v1, v2, v3( in_place_index_t<1>{} ), v4( in_place_index_t<1>{} ), v5( 3.14f ), v6( 3.14f );
70 
71         STATIC_ASSERT( v1 == v2 );
72         STATIC_ASSERT( !(v1 != v2) );
73 
74         STATIC_ASSERT( v1 != v3 );
75         STATIC_ASSERT( !(v1 == v3) );
76 
77         STATIC_ASSERT( v3 == v4 );
78         STATIC_ASSERT( !(v3 != v4) );
79 
80         STATIC_ASSERT( v1 != v5 );
81         STATIC_ASSERT( !(v1 == v5) );
82 
83         STATIC_ASSERT( v3 != v5 );
84         STATIC_ASSERT( !(v3 == v5) );
85 
86         STATIC_ASSERT( v5 == v6 );
87         STATIC_ASSERT( !(v5 != v6) );
88     }
89 
90     {
91         constexpr variant<X> v1, v2;
92 
93         STATIC_ASSERT( !(v1 == v2) );
94         STATIC_ASSERT( !(v1 != v2) );
95     }
96 }
97 
98 #endif
99