diff --git a/libcxx/test/libcxx/containers/container.adaptors/flat.multiset/insert.temporary.pass.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.multiset/insert.temporary.pass.cpp new file mode 100644 index 0000000000000..c185d0c700ed2 --- /dev/null +++ b/libcxx/test/libcxx/containers/container.adaptors/flat.multiset/insert.temporary.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// + +// https://github.com/llvm/llvm-project/issues/119016 + +#include + +#include +#include +#include + +#include "../flat_helpers.h" +#include "test_macros.h" + +bool test() { + using M = std::flat_multiset; + { + M m; + TrackCopyMove t; + m.insert(t); + assert(m.begin()->copy_count == 1); + assert(m.begin()->move_count == 0); + } + { + M m; + TrackCopyMove t; + m.emplace(t); + assert(m.begin()->copy_count == 1); + assert(m.begin()->move_count == 0); + } + + return true; +} + +int main(int, char**) { + test(); + + return 0; +} diff --git a/libcxx/test/libcxx/containers/container.adaptors/flat.set/insert.temporary.pass.cpp b/libcxx/test/libcxx/containers/container.adaptors/flat.set/insert.temporary.pass.cpp new file mode 100644 index 0000000000000..e71f35129ddac --- /dev/null +++ b/libcxx/test/libcxx/containers/container.adaptors/flat.set/insert.temporary.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 + +// + +// https://github.com/llvm/llvm-project/issues/119016 + +#include + +#include +#include +#include + +#include "../flat_helpers.h" +#include "test_macros.h" + +bool test() { + using M = std::flat_set; + { + M m; + TrackCopyMove t; + m.insert(t); + assert(m.begin()->copy_count == 1); + assert(m.begin()->move_count == 0); + } + { + M m; + TrackCopyMove t; + m.emplace(t); + assert(m.begin()->copy_count == 1); + assert(m.begin()->move_count == 0); + } + + return true; +} + +int main(int, char**) { + test(); + + return 0; +} diff --git a/libcxx/test/libcxx/containers/container.adaptors/flat_helpers.h b/libcxx/test/libcxx/containers/container.adaptors/flat_helpers.h new file mode 100644 index 0000000000000..1242c29715daa --- /dev/null +++ b/libcxx/test/libcxx/containers/container.adaptors/flat_helpers.h @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef TEST_LIBCXX_CONTAINERS_CONTAINER_ADAPTORS_FLAT_HELPERS_H +#define TEST_LIBCXX_CONTAINERS_CONTAINER_ADAPTORS_FLAT_HELPERS_H + +struct TrackCopyMove { + mutable int copy_count = 0; + int move_count = 0; + + constexpr TrackCopyMove() = default; + constexpr TrackCopyMove(const TrackCopyMove& other) : copy_count(other.copy_count), move_count(other.move_count) { + ++copy_count; + ++other.copy_count; + } + + constexpr TrackCopyMove(TrackCopyMove&& other) noexcept : copy_count(other.copy_count), move_count(other.move_count) { + ++move_count; + ++other.move_count; + } + constexpr TrackCopyMove& operator=(const TrackCopyMove& other) { + ++copy_count; + ++other.copy_count; + return *this; + } + constexpr TrackCopyMove& operator=(TrackCopyMove&& other) noexcept { + ++move_count; + ++other.move_count; + return *this; + } + constexpr bool operator==(const TrackCopyMove&) const { return true; } + constexpr bool operator<(const TrackCopyMove&) const { return false; } +}; + +#endif // TEST_LIBCXX_CONTAINERS_CONTAINER_ADAPTORS_FLAT_HELPERS_H