Commit | Line | Data |
---|---|---|
cf57ad6d AB |
1 | /* Self tests for vector utility routines for GDB, the GNU debugger. |
2 | ||
3 | Copyright (C) 2019 Free Software Foundation, Inc. | |
4 | ||
5 | This file is part of GDB. | |
6 | ||
7 | This program is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 3 of the License, or | |
10 | (at your option) any later version. | |
11 | ||
12 | This program 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 | |
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
19 | ||
20 | #include "gdbsupport/common-defs.h" | |
21 | #include "gdbsupport/selftest.h" | |
22 | ||
23 | #include "gdbsupport/gdb_vecs.h" | |
24 | ||
25 | namespace selftests { | |
26 | namespace vector_utils_tests { | |
27 | ||
28 | static void | |
29 | unordered_remove_tests () | |
30 | { | |
31 | /* Create vector with a single object in, and then remove that object. | |
32 | This test was added after a bug was discovered where unordered_remove | |
33 | would cause a self move assign. If the C++ standard library is | |
34 | compiled in debug mode (by passing -D_GLIBCXX_DEBUG=1) and the | |
35 | operator= is removed from struct obj this test used to fail with an | |
36 | error from the C++ standard library. */ | |
37 | struct obj | |
38 | { | |
39 | std::vector<void *> var; | |
40 | ||
41 | obj &operator= (const obj &other) | |
42 | { | |
43 | if (this == &other) | |
44 | error (_("detected self move assign")); | |
45 | this->var = other.var; | |
46 | return *this; | |
47 | } | |
48 | }; | |
49 | ||
50 | std::vector<obj> v; | |
51 | v.emplace_back (); | |
52 | auto it = v.end () - 1; | |
53 | unordered_remove (v, it); | |
54 | SELF_CHECK (v.empty ()); | |
55 | } | |
56 | ||
57 | } /* namespace vector_utils_tests */ | |
58 | } /* amespace selftests */ | |
59 | ||
60 | void | |
61 | _initialize_vec_utils_selftests () | |
62 | { | |
63 | selftests::register_test | |
64 | ("unordered_remove", | |
65 | selftests::vector_utils_tests::unordered_remove_tests); | |
66 | } |