annotate gcc/unique-ptr-tests.cc @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 84e7813d76e9
children 1830386684a0
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.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 2017-2018 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
kono
parents:
diff changeset
34 struct stats
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 stats () : ctor_count (0), dtor_count (0) {}
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 int ctor_count;
kono
parents:
diff changeset
39 int dtor_count;
kono
parents:
diff changeset
40 };
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 /* A class that uses "stats" to track its ctor and dtor invocations. */
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 class foo
kono
parents:
diff changeset
45 {
kono
parents:
diff changeset
46 public:
kono
parents:
diff changeset
47 foo (stats &s) : m_s (s) { ++m_s.ctor_count; }
kono
parents:
diff changeset
48 ~foo () { ++m_s.dtor_count; }
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 int example_method () const { return 42; }
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 private:
kono
parents:
diff changeset
53 foo (const foo&);
kono
parents:
diff changeset
54 foo & operator= (const foo &);
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 private:
kono
parents:
diff changeset
57 stats &m_s;
kono
parents:
diff changeset
58 };
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 /* A struct for testing unique_ptr<T[]>. */
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 struct has_default_ctor
kono
parents:
diff changeset
63 {
kono
parents:
diff changeset
64 has_default_ctor () : m_field (42) {}
kono
parents:
diff changeset
65 int m_field;
kono
parents:
diff changeset
66 };
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 /* A dummy struct for testing unique_xmalloc_ptr. */
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 struct dummy
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 int field;
kono
parents:
diff changeset
73 };
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 } // anonymous namespace
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 /* Verify that the default ctor inits ptrs to NULL. */
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 static void
kono
parents:
diff changeset
80 test_null_ptr ()
kono
parents:
diff changeset
81 {
kono
parents:
diff changeset
82 gnu::unique_ptr<void *> p;
kono
parents:
diff changeset
83 ASSERT_EQ (NULL, p);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 gnu::unique_xmalloc_ptr<void *> q;
kono
parents:
diff changeset
86 ASSERT_EQ (NULL, q);
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 /* Verify that deletion happens when a unique_ptr goes out of scope. */
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 static void
kono
parents:
diff changeset
92 test_implicit_deletion ()
kono
parents:
diff changeset
93 {
kono
parents:
diff changeset
94 stats s;
kono
parents:
diff changeset
95 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
96 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
100 ASSERT_NE (NULL, f);
kono
parents:
diff changeset
101 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
102 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
103 }
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 /* Verify that the foo was implicitly deleted. */
kono
parents:
diff changeset
106 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
107 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Verify that we can assign to a NULL unique_ptr. */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 static void
kono
parents:
diff changeset
113 test_overwrite_of_null ()
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 stats s;
kono
parents:
diff changeset
116 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
117 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 gnu::unique_ptr<foo> f;
kono
parents:
diff changeset
121 ASSERT_EQ (NULL, f);
kono
parents:
diff changeset
122 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
123 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 /* Overwrite with a non-NULL value. */
kono
parents:
diff changeset
126 f = gnu::unique_ptr<foo> (new foo (s));
kono
parents:
diff changeset
127 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
128 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 /* Verify that the foo is implicitly deleted. */
kono
parents:
diff changeset
132 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
133 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
134 }
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 /* Verify that we can assign to a non-NULL unique_ptr. */
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 static void
kono
parents:
diff changeset
139 test_overwrite_of_non_null ()
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 stats s;
kono
parents:
diff changeset
142 ASSERT_EQ (0, s.ctor_count);
kono
parents:
diff changeset
143 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
147 ASSERT_NE (NULL, f);
kono
parents:
diff changeset
148 ASSERT_EQ (1, s.ctor_count);
kono
parents:
diff changeset
149 ASSERT_EQ (0, s.dtor_count);
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 /* Overwrite with a different value. */
kono
parents:
diff changeset
152 f = gnu::unique_ptr<foo> (new foo (s));
kono
parents:
diff changeset
153 ASSERT_EQ (2, s.ctor_count);
kono
parents:
diff changeset
154 ASSERT_EQ (1, s.dtor_count);
kono
parents:
diff changeset
155 }
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 /* Verify that the 2nd foo was implicitly deleted. */
kono
parents:
diff changeset
158 ASSERT_EQ (2, s.ctor_count);
kono
parents:
diff changeset
159 ASSERT_EQ (2, s.dtor_count);
kono
parents:
diff changeset
160 }
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 /* Verify that unique_ptr's overloaded ops work. */
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 static void
kono
parents:
diff changeset
165 test_overloaded_ops ()
kono
parents:
diff changeset
166 {
kono
parents:
diff changeset
167 stats s;
kono
parents:
diff changeset
168 gnu::unique_ptr<foo> f (new foo (s));
kono
parents:
diff changeset
169 ASSERT_EQ (42, f->example_method ());
kono
parents:
diff changeset
170 ASSERT_EQ (42, (*f).example_method ());
kono
parents:
diff changeset
171 ASSERT_EQ (f, f);
kono
parents:
diff changeset
172 ASSERT_NE (NULL, f.get ());
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 gnu::unique_ptr<foo> g (new foo (s));
kono
parents:
diff changeset
175 ASSERT_NE (f, g);
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 /* Verify that the gnu::unique_ptr specialization for T[] works. */
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 static void
kono
parents:
diff changeset
181 test_array_new ()
kono
parents:
diff changeset
182 {
kono
parents:
diff changeset
183 const int num = 10;
kono
parents:
diff changeset
184 gnu::unique_ptr<has_default_ctor[]> p (new has_default_ctor[num]);
kono
parents:
diff changeset
185 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
186 /* Verify that operator[] works, and that the default ctor was called
kono
parents:
diff changeset
187 on each element. */
kono
parents:
diff changeset
188 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
189 ASSERT_EQ (42, p[i].m_field);
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 /* Verify that gnu::unique_xmalloc_ptr works. */
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 static void
kono
parents:
diff changeset
195 test_xmalloc ()
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 gnu::unique_xmalloc_ptr<dummy> p (XNEW (dummy));
kono
parents:
diff changeset
198 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
199 }
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 /* Verify the gnu::unique_xmalloc_ptr specialization for T[]. */
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 static void
kono
parents:
diff changeset
204 test_xmalloc_array ()
kono
parents:
diff changeset
205 {
kono
parents:
diff changeset
206 const int num = 10;
kono
parents:
diff changeset
207 gnu::unique_xmalloc_ptr<dummy[]> p (XNEWVEC (dummy, num));
kono
parents:
diff changeset
208 ASSERT_NE (NULL, p.get ());
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 /* Verify that operator[] works. */
kono
parents:
diff changeset
211 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
212 p[i].field = 42;
kono
parents:
diff changeset
213 for (int i = 0; i < num; i++)
kono
parents:
diff changeset
214 ASSERT_EQ (42, p[i].field);
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 /* Run all of the selftests within this file. */
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 void
kono
parents:
diff changeset
220 unique_ptr_tests_cc_tests ()
kono
parents:
diff changeset
221 {
kono
parents:
diff changeset
222 test_null_ptr ();
kono
parents:
diff changeset
223 test_implicit_deletion ();
kono
parents:
diff changeset
224 test_overwrite_of_null ();
kono
parents:
diff changeset
225 test_overwrite_of_non_null ();
kono
parents:
diff changeset
226 test_overloaded_ops ();
kono
parents:
diff changeset
227 test_array_new ();
kono
parents:
diff changeset
228 test_xmalloc ();
kono
parents:
diff changeset
229 test_xmalloc_array ();
kono
parents:
diff changeset
230 }
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 } // namespace selftest
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 #endif /* #if CHECKING_P */