annotate gcc/unique-ptr-tests.cc @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Unit tests for unique-ptr.h.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2017-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #define INCLUDE_UNIQUE_PTR
kono
parents:
diff changeset
22 #include "system.h"
kono
parents:
diff changeset
23 #include "coretypes.h"
kono
parents:
diff changeset
24 #include "selftest.h"
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #if CHECKING_P
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 namespace selftest {
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 namespace {
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* A class for counting ctor and dtor invocations. */
kono
parents:
diff changeset
33
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
34 class stats
111
kono
parents:
diff changeset
35 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 public:
111
kono
parents:
diff changeset
37 stats () : ctor_count (0), dtor_count (0) {}
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 int ctor_count;
kono
parents:
diff changeset
40 int dtor_count;
kono
parents:
diff changeset
41 };
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 /* A class that uses "stats" to track its ctor and dtor invocations. */
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 class foo
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 public:
kono
parents:
diff changeset
48 foo (stats &s) : m_s (s) { ++m_s.ctor_count; }
kono
parents:
diff changeset
49 ~foo () { ++m_s.dtor_count; }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 int example_method () const { return 42; }
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 private:
kono
parents:
diff changeset
54 foo (const foo&);
kono
parents:
diff changeset
55 foo & operator= (const foo &);
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 private:
kono
parents:
diff changeset
58 stats &m_s;
kono
parents:
diff changeset
59 };
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 /* A struct for testing unique_ptr<T[]>. */
kono
parents:
diff changeset
62
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 class has_default_ctor
111
kono
parents:
diff changeset
64 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 public:
111
kono
parents:
diff changeset
66 has_default_ctor () : m_field (42) {}
kono
parents:
diff changeset
67 int m_field;
kono
parents:
diff changeset
68 };
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 /* A dummy struct for testing unique_xmalloc_ptr. */
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 struct dummy
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 int field;
kono
parents:
diff changeset
75 };
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 } // anonymous namespace
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 /* Verify that the default ctor inits ptrs to NULL. */
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 static void
kono
parents:
diff changeset
82 test_null_ptr ()
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 gnu::unique_ptr<void *> p;
kono
parents:
diff changeset
85 ASSERT_EQ (NULL, p);
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 gnu::unique_xmalloc_ptr<void *> q;
kono
parents:
diff changeset
88 ASSERT_EQ (NULL, q);
kono
parents:
diff changeset
89 }
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 /* Verify that deletion happens when a unique_ptr goes out of scope. */
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 static void
kono
parents:
diff changeset
94 test_implicit_deletion ()
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 stats s;
kono
parents:
diff changeset
97 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
98 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 {
kono
parents:
diff changeset
101 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
102 ASSERT_NE (NULL, f);
kono
parents:
diff changeset
103 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
104 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
105 }
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 /* Verify that the foo was implicitly deleted. */
kono
parents:
diff changeset
108 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
109 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 /* Verify that we can assign to a NULL unique_ptr. */
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 static void
kono
parents:
diff changeset
115 test_overwrite_of_null ()
kono
parents:
diff changeset
116 {
kono
parents:
diff changeset
117 stats s;
kono
parents:
diff changeset
118 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
119 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 gnu::unique_ptr<foo> f;
kono
parents:
diff changeset
123 ASSERT_EQ (NULL, f);
kono
parents:
diff changeset
124 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
125 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 /* Overwrite with a non-NULL value. */
kono
parents:
diff changeset
128 f = gnu::unique_ptr<foo> (new foo (s));
kono
parents:
diff changeset
129 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
130 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 /* Verify that the foo is implicitly deleted. */
kono
parents:
diff changeset
134 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
135 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
136 }
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 /* Verify that we can assign to a non-NULL unique_ptr. */
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 static void
kono
parents:
diff changeset
141 test_overwrite_of_non_null ()
kono
parents:
diff changeset
142 {
kono
parents:
diff changeset
143 stats s;
kono
parents:
diff changeset
144 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
145 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
149 ASSERT_NE (NULL, f);
kono
parents:
diff changeset
150 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
151 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* Overwrite with a different value. */
kono
parents:
diff changeset
154 f = gnu::unique_ptr<foo> (new foo (s));
kono
parents:
diff changeset
155 ASSERT_EQ (2, s.ctor_count);
kono
parents:
diff changeset
156 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
157 }
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 /* Verify that the 2nd foo was implicitly deleted. */
kono
parents:
diff changeset
160 ASSERT_EQ (2, s.ctor_count);
kono
parents:
diff changeset
161 ASSERT_EQ (2, s.dtor_count);
kono
parents:
diff changeset
162 }
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 /* Verify that unique_ptr's overloaded ops work. */
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 static void
kono
parents:
diff changeset
167 test_overloaded_ops ()
kono
parents:
diff changeset
168 {
kono
parents:
diff changeset
169 stats s;
kono
parents:
diff changeset
170 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
171 ASSERT_EQ (42, f->example_method ());
kono
parents:
diff changeset
172 ASSERT_EQ (42, (*f).example_method ());
kono
parents:
diff changeset
173 ASSERT_EQ (f, f);
kono
parents:
diff changeset
174 ASSERT_NE (NULL, f.get ());
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 gnu::unique_ptr<foo> g (new foo (s));
kono
parents:
diff changeset
177 ASSERT_NE (f, g);
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 /* Verify that the gnu::unique_ptr specialization for T[] works. */
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 static void
kono
parents:
diff changeset
183 test_array_new ()
kono
parents:
diff changeset
184 {
kono
parents:
diff changeset
185 const int num = 10;
kono
parents:
diff changeset
186 gnu::unique_ptr<has_default_ctor[]> p (new has_default_ctor[num]);
kono
parents:
diff changeset
187 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
188 /* Verify that operator[] works, and that the default ctor was called
kono
parents:
diff changeset
189 on each element. */
kono
parents:
diff changeset
190 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
191 ASSERT_EQ (42, p[i].m_field);
kono
parents:
diff changeset
192 }
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 /* Verify that gnu::unique_xmalloc_ptr works. */
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 static void
kono
parents:
diff changeset
197 test_xmalloc ()
kono
parents:
diff changeset
198 {
kono
parents:
diff changeset
199 gnu::unique_xmalloc_ptr<dummy> p (XNEW (dummy));
kono
parents:
diff changeset
200 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
201 }
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 /* Verify the gnu::unique_xmalloc_ptr specialization for T[]. */
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 static void
kono
parents:
diff changeset
206 test_xmalloc_array ()
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 const int num = 10;
kono
parents:
diff changeset
209 gnu::unique_xmalloc_ptr<dummy[]> p (XNEWVEC (dummy, num));
kono
parents:
diff changeset
210 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 /* Verify that operator[] works. */
kono
parents:
diff changeset
213 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
214 p[i].field = 42;
kono
parents:
diff changeset
215 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
216 ASSERT_EQ (42, p[i].field);
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 /* Run all of the selftests within this file. */
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 void
kono
parents:
diff changeset
222 unique_ptr_tests_cc_tests ()
kono
parents:
diff changeset
223 {
kono
parents:
diff changeset
224 test_null_ptr ();
kono
parents:
diff changeset
225 test_implicit_deletion ();
kono
parents:
diff changeset
226 test_overwrite_of_null ();
kono
parents:
diff changeset
227 test_overwrite_of_non_null ();
kono
parents:
diff changeset
228 test_overloaded_ops ();
kono
parents:
diff changeset
229 test_array_new ();
kono
parents:
diff changeset
230 test_xmalloc ();
kono
parents:
diff changeset
231 test_xmalloc_array ();
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 } // namespace selftest
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 #endif /* #if CHECKING_P */