From fadf88fc3bc271a38704b8211b69bb32551d06bb Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Thu, 1 Jan 2026 13:41:40 -0600 Subject: [PATCH 1/3] Add missing compile-only tests in CMake --- test/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 902faf6e22..2a22d34ca4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -163,4 +163,10 @@ cfoa_tests(SOURCES cfoa/rw_spinlock_test6.cpp) cfoa_tests(SOURCES cfoa/rw_spinlock_test7.cpp) cfoa_tests(SOURCES cfoa/rw_spinlock_test8.cpp) +# Compile tests + +fca_tests(TYPE compile NAME explicit_instantiation_tests SOURCES unordered/explicit_instantiation_tests.cpp) +foa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES unordered/explicit_instantiation_tests.cpp) +cfoa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES cfoa/explicit_instantiation_tests.cpp) + endif() From 33591639e3cfa283edc5f14014373a006c6425fa Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Thu, 1 Jan 2026 13:35:18 -0600 Subject: [PATCH 2/3] Rewrite the FOA containers' CFOA constructors so that a class with a template conversion operator does not instantiate the CFOA container --- .../boost/unordered/unordered_flat_map.hpp | 6 ++- .../boost/unordered/unordered_flat_set.hpp | 6 ++- .../boost/unordered/unordered_node_map.hpp | 6 ++- .../boost/unordered/unordered_node_set.hpp | 6 ++- test/CMakeLists.txt | 2 + test/Jamfile.v2 | 2 + test/unordered/conversion_operator_tests.cpp | 46 +++++++++++++++++++ 7 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 test/unordered/conversion_operator_tests.cpp diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 56ec1261ed..e478314afc 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -1,5 +1,6 @@ // Copyright (C) 2022-2023 Christian Mazakas // Copyright (C) 2024-2025 Joaquin M Lopez Munoz +// Copyright (C) 2026 Braden Ganetsky // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -182,9 +183,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> unordered_flat_map( - concurrent_flat_map&& other) + concurrent_flat_map&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/unordered_flat_set.hpp b/include/boost/unordered/unordered_flat_set.hpp index b06a0d773c..629750342c 100644 --- a/include/boost/unordered/unordered_flat_set.hpp +++ b/include/boost/unordered/unordered_flat_set.hpp @@ -1,5 +1,6 @@ // Copyright (C) 2022-2023 Christian Mazakas // Copyright (C) 2024-2025 Joaquin M Lopez Munoz +// Copyright (C) 2026 Braden Ganetsky // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -178,9 +179,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> unordered_flat_set( - concurrent_flat_set&& other) + concurrent_flat_set&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/unordered_node_map.hpp b/include/boost/unordered/unordered_node_map.hpp index a9d7ef449c..73dbdc841b 100644 --- a/include/boost/unordered/unordered_node_map.hpp +++ b/include/boost/unordered/unordered_node_map.hpp @@ -1,5 +1,6 @@ // Copyright (C) 2022-2023 Christian Mazakas // Copyright (C) 2024-2025 Joaquin M Lopez Munoz +// Copyright (C) 2026 Braden Ganetsky // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -189,9 +190,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> unordered_node_map( - concurrent_node_map&& other) + concurrent_node_map&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/unordered_node_set.hpp b/include/boost/unordered/unordered_node_set.hpp index 1ac71b414c..48a2e212d6 100644 --- a/include/boost/unordered/unordered_node_set.hpp +++ b/include/boost/unordered/unordered_node_set.hpp @@ -1,5 +1,6 @@ // Copyright (C) 2022-2023 Christian Mazakas // Copyright (C) 2024-2025 Joaquin M Lopez Munoz +// Copyright (C) 2026 Braden Ganetsky // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -187,9 +188,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> unordered_node_set( - concurrent_node_set&& other) + concurrent_node_set&& other) : table_(std::move(other.table_)) { } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2a22d34ca4..22e19f1229 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -169,4 +169,6 @@ fca_tests(TYPE compile NAME explicit_instantiation_tests SOURCES unordered/expli foa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES unordered/explicit_instantiation_tests.cpp) cfoa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES cfoa/explicit_instantiation_tests.cpp) +foa_tests(TYPE compile NAME conversion_operator_tests SOURCES unordered/conversion_operator_tests.cpp) + endif() diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 40d206f664..fb9885b5ef 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -166,6 +166,8 @@ compile unordered/explicit_instantiation_tests.cpp : compile unordered/explicit_instantiation_tests.cpp : BOOST_UNORDERED_FOA_TESTS : foa_explicit_instantiation_tests ; compile cfoa/explicit_instantiation_tests.cpp : : cfoa_explicit_instantiation_tests ; +compile unordered/conversion_operator_tests.cpp : BOOST_UNORDERED_FOA_TESTS : foa_conversion_operator_tests ; + local FCA_EXCEPTION_TESTS = constructor_exception_tests copy_exception_tests diff --git a/test/unordered/conversion_operator_tests.cpp b/test/unordered/conversion_operator_tests.cpp new file mode 100644 index 0000000000..c1c1492bd8 --- /dev/null +++ b/test/unordered/conversion_operator_tests.cpp @@ -0,0 +1,46 @@ +// Copyright 2026 Braden Ganetsky +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#if !defined(BOOST_UNORDERED_FOA_TESTS) +#error "This test is only for the FOA-style conatiners" +#endif + +#include +#include +#include +#include +#include +// Don't include the CFOA headers here! + +using flat_map = boost::unordered::unordered_flat_map; +using flat_set = boost::unordered::unordered_flat_set; +using node_map = boost::unordered::unordered_node_map; +using node_set = boost::unordered::unordered_node_set; + +struct constrained_template_converter +{ + struct dummy + { + }; + template ::value, int>::type = 0> + operator T() const + { + return T{}; + } +}; + +// Check whether the corresponding CFOA container gets instantiated. +// The CFOA headers aren't included, so this would fail to compile if the CFOA +// container was instantiated. +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); + +int main() { return 0; } From 17cf5a24c8c8de61c051a010863de582ccb0d0ac Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Thu, 1 Jan 2026 13:50:16 -0600 Subject: [PATCH 3/3] Rewrite the CFOA containers' FOA constructors so that a class with a template conversion operator does not instantiate the FOA container --- .../boost/unordered/concurrent_flat_map.hpp | 7 ++-- .../boost/unordered/concurrent_flat_set.hpp | 7 ++-- .../boost/unordered/concurrent_node_map.hpp | 6 ++- .../boost/unordered/concurrent_node_set.hpp | 6 ++- test/CMakeLists.txt | 1 + test/Jamfile.v2 | 1 + test/cfoa/conversion_operator_tests.cpp | 42 +++++++++++++++++++ 7 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 test/cfoa/conversion_operator_tests.cpp diff --git a/include/boost/unordered/concurrent_flat_map.hpp b/include/boost/unordered/concurrent_flat_map.hpp index 6b54ce5e35..7ba2286a0a 100644 --- a/include/boost/unordered/concurrent_flat_map.hpp +++ b/include/boost/unordered/concurrent_flat_map.hpp @@ -2,6 +2,7 @@ * * Copyright 2023 Christian Mazakas. * Copyright 2023-2026 Joaquin M Lopez Munoz. + * Copyright 2026 Braden Ganetsky * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) @@ -189,10 +190,10 @@ namespace boost { { } - - template + template ::value, int>::type = 0> concurrent_flat_map( - unordered_flat_map&& other) + unordered_flat_map&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/concurrent_flat_set.hpp b/include/boost/unordered/concurrent_flat_set.hpp index 54cb6c9fcb..162c4c2838 100644 --- a/include/boost/unordered/concurrent_flat_set.hpp +++ b/include/boost/unordered/concurrent_flat_set.hpp @@ -2,6 +2,7 @@ * * Copyright 2023 Christian Mazakas. * Copyright 2023-2026 Joaquin M Lopez Munoz. + * Copyright 2026 Braden Ganetsky * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) @@ -186,10 +187,10 @@ namespace boost { { } - - template + template ::value, int>::type = 0> concurrent_flat_set( - unordered_flat_set&& other) + unordered_flat_set&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/concurrent_node_map.hpp b/include/boost/unordered/concurrent_node_map.hpp index e75f965914..50f667bc36 100644 --- a/include/boost/unordered/concurrent_node_map.hpp +++ b/include/boost/unordered/concurrent_node_map.hpp @@ -2,6 +2,7 @@ * * Copyright 2023 Christian Mazakas. * Copyright 2023-2026 Joaquin M Lopez Munoz. + * Copyright 2026 Braden Ganetsky * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) @@ -197,9 +198,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> concurrent_node_map( - unordered_node_map&& other) + unordered_node_map&& other) : table_(std::move(other.table_)) { } diff --git a/include/boost/unordered/concurrent_node_set.hpp b/include/boost/unordered/concurrent_node_set.hpp index 71818f967b..3cdcd947f6 100644 --- a/include/boost/unordered/concurrent_node_set.hpp +++ b/include/boost/unordered/concurrent_node_set.hpp @@ -2,6 +2,7 @@ * * Copyright 2023 Christian Mazakas. * Copyright 2023-2026 Joaquin M Lopez Munoz. + * Copyright 2026 Braden Ganetsky * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) @@ -194,9 +195,10 @@ namespace boost { { } - template + template ::value, int>::type = 0> concurrent_node_set( - unordered_node_set&& other) + unordered_node_set&& other) : table_(std::move(other.table_)) { } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 22e19f1229..81f1e8100f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -170,5 +170,6 @@ foa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES unordered/expli cfoa_tests(TYPE compile NAME explicit_instantiation_tests SOURCES cfoa/explicit_instantiation_tests.cpp) foa_tests(TYPE compile NAME conversion_operator_tests SOURCES unordered/conversion_operator_tests.cpp) +cfoa_tests(TYPE compile NAME conversion_operator_tests SOURCES cfoa/conversion_operator_tests.cpp) endif() diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index fb9885b5ef..31265e4587 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -167,6 +167,7 @@ compile unordered/explicit_instantiation_tests.cpp : BOOST_UNORDERED_FOA compile cfoa/explicit_instantiation_tests.cpp : : cfoa_explicit_instantiation_tests ; compile unordered/conversion_operator_tests.cpp : BOOST_UNORDERED_FOA_TESTS : foa_conversion_operator_tests ; +compile cfoa/conversion_operator_tests.cpp : : cfoa_conversion_operator_tests ; local FCA_EXCEPTION_TESTS = constructor_exception_tests diff --git a/test/cfoa/conversion_operator_tests.cpp b/test/cfoa/conversion_operator_tests.cpp new file mode 100644 index 0000000000..71ca5611f1 --- /dev/null +++ b/test/cfoa/conversion_operator_tests.cpp @@ -0,0 +1,42 @@ +// Copyright 2026 Braden Ganetsky +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +// Don't include the FOA headers here! + +using c_flat_map = boost::unordered::concurrent_flat_map; +using c_flat_set = boost::unordered::concurrent_flat_set; +using c_node_map = boost::unordered::concurrent_node_map; +using c_node_set = boost::unordered::concurrent_node_set; + +struct constrained_template_converter +{ + struct dummy + { + }; + template ::value, int>::type = 0> + operator T() const + { + return T{}; + } +}; + +// Check whether the corresponding FOA container gets instantiated. +// The FOA headers aren't included, so this would fail to compile if the FOA +// container was instantiated. +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); +BOOST_STATIC_ASSERT( + (!std::is_constructible::value)); + +int main() { return 0; }