1 // { dg-options "-std=gnu++17" }
2 // { dg-do compile { target c++17 } }
3 
4 // Copyright (C) 2016-2018 Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library.  This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11 //
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3.  If not see
19 // <http://www.gnu.org/licenses/>.
20 
21 #include <type_traits>
22 #include <testsuite_tr1.h>
23 
test01()24 void test01()
25 {
26   using std::has_unique_object_representations;
27   using __gnu_test::test_category;
28 
29   // Positive tests.
30   static_assert(test_category<has_unique_object_representations,
31 		char>(true), "");
32   static_assert(test_category<has_unique_object_representations,
33 		unsigned char>(true), "");
34   static_assert(test_category<has_unique_object_representations,
35 		signed char>(true), "");
36   static_assert(test_category<has_unique_object_representations,
37 		unsigned>(true), "");
38   static_assert(test_category<has_unique_object_representations,
39                 bool>(true), "");
40 
41   enum E : unsigned { };
42   static_assert(test_category<has_unique_object_representations,
43 		E>(true), "");
44 
45   static_assert(test_category<has_unique_object_representations,
46 		unsigned[3]>(true), "");
47   static_assert(test_category<has_unique_object_representations,
48 		unsigned[3][2]>(true), "");
49   static_assert(test_category<has_unique_object_representations,
50 		unsigned[]>(true), "");
51   static_assert(test_category<has_unique_object_representations,
52 		unsigned[][2]>(true), "");
53   static_assert(test_category<has_unique_object_representations,
54 		E[3]>(true), "");
55   static_assert(test_category<has_unique_object_representations,
56 		E[3][2]>(true), "");
57   static_assert(test_category<has_unique_object_representations,
58 		E[]>(true), "");
59   static_assert(test_category<has_unique_object_representations,
60 		E[][2]>(true), "");
61 
62   struct Padded {
63     char c1;
64     alignas(4) char c2;
65   };
66 
67   struct Bitfield {
68     int i : 3;
69   };
70 
71   struct Aligned {
72     alignas(4) char c;
73   };
74 
75   // Negative tests.
76   static_assert(test_category<has_unique_object_representations,
77 		void>(false), "");
78   static_assert(test_category<has_unique_object_representations,
79                 float>(false), ""); // implementation-defined
80   static_assert(test_category<has_unique_object_representations,
81 		Padded>(false), "");
82   static_assert(test_category<has_unique_object_representations,
83 		Padded[2]>(false), "");
84   static_assert(test_category<has_unique_object_representations,
85 		Padded[2][1]>(false), "");
86   static_assert(test_category<has_unique_object_representations,
87 		Padded[]>(false), "");
88   static_assert(test_category<has_unique_object_representations,
89 		Padded[][1]>(false), "");
90   static_assert(test_category<has_unique_object_representations,
91 		Bitfield>(false), "");
92   static_assert(test_category<has_unique_object_representations,
93 		Bitfield[2]>(false), "");
94   static_assert(test_category<has_unique_object_representations,
95 		Bitfield[2][1]>(false), "");
96   static_assert(test_category<has_unique_object_representations,
97 		Bitfield[]>(false), "");
98   static_assert(test_category<has_unique_object_representations,
99 		Bitfield[][1]>(false), "");
100   static_assert(test_category<has_unique_object_representations,
101 		Aligned>(false), "");
102   static_assert(test_category<has_unique_object_representations,
103 		Aligned[2]>(false), "");
104   static_assert(test_category<has_unique_object_representations,
105 		Aligned[2][1]>(false), "");
106   static_assert(test_category<has_unique_object_representations,
107 		Aligned[]>(false), "");
108   static_assert(test_category<has_unique_object_representations,
109 		Aligned[][1]>(false), "");
110 }
111 
112 void
test02()113 test02()
114 {
115   using std::has_unique_object_representations;
116   using std::has_unique_object_representations_v;
117 
118   static_assert(has_unique_object_representations_v<int>
119 		== has_unique_object_representations<int>::value);
120   static_assert(has_unique_object_representations_v<void>
121 		== has_unique_object_representations<void>::value);
122   static_assert(has_unique_object_representations_v<float>
123 		== has_unique_object_representations<float>::value);
124 }
125