From 8ed60bcbe124e8178abdd1d203282a1b9c10f794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Tue, 3 Feb 2026 15:50:39 +0100 Subject: [PATCH] Protect CTAD from old clang compilers that suffer from ICE --- test/deque_test.cpp | 38 +++++++++++++++++++++------------- test/segmented_vector_test.cpp | 38 +++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/test/deque_test.cpp b/test/deque_test.cpp index a16f81d..b788c32 100644 --- a/test/deque_test.cpp +++ b/test/deque_test.cpp @@ -307,24 +307,31 @@ bool do_test() if(!test::CheckEqualContainers(cntc, stdc)) return 1; } -#ifndef BOOST_CONTAINER_NO_CXX17_CTAD - //Check Constructor Template Auto Deduction - { - auto gold = MyStd{ 1, 2, 3 }; - auto test = deque(gold.begin(), gold.end()); - if(!test::CheckEqualContainers(gold, test)) return false; - } - { - auto gold = MyStd{ 1, 2, 3 }; - auto test = deque(gold.begin(), gold.end(), new_allocator()); - if(!test::CheckEqualContainers(gold, test)) return false; - } -#endif - std::cout << std::endl << "Test OK!" << std::endl; return true; } +bool test_ctad() //Older clang versions suffer from ICE here +#if !defined(BOOST_CONTAINER_NO_CXX17_CTAD) && (!defined(BOOST_CLANG) || (BOOST_CLANG_VERSION >= 80000)) +{ + typedef std::vector MyStd; + //Check Constructor Template Auto Deduction + { + MyStd gold = MyStd{ 1, 2, 3 }; + deque test = deque(gold.begin(), gold.end()); + if (!test::CheckEqualContainers(gold, test)) return false; + } + { + MyStd gold = MyStd{ 1, 2, 3 }; + deque test = deque(gold.begin(), gold.end(), new_allocator()); + if (!test::CheckEqualContainers(gold, test)) return false; + } + return true; +} +#else +{ return true; } +#endif + template struct GetAllocatorCont { @@ -434,6 +441,9 @@ int main () if(!do_test()) return 1; + if (!test_ctad()) + return 1; + //Default block size if(!do_test_default_block_size()) return 1; diff --git a/test/segmented_vector_test.cpp b/test/segmented_vector_test.cpp index 71cdb97..ff702a8 100644 --- a/test/segmented_vector_test.cpp +++ b/test/segmented_vector_test.cpp @@ -295,24 +295,31 @@ bool do_test() if(!test::CheckEqualContainers(cntc, stdc)) return 1; } -#ifndef BOOST_CONTAINER_NO_CXX17_CTAD - //Check Constructor Template Auto Deduction - { - auto gold = MyStd{ 1, 2, 3 }; - auto test = segmented_vector(gold.begin(), gold.end()); - if(!test::CheckEqualContainers(gold, test)) return false; - } - { - auto gold = MyStd{ 1, 2, 3 }; - auto test = segmented_vector(gold.begin(), gold.end(), new_allocator()); - if(!test::CheckEqualContainers(gold, test)) return false; - } -#endif - std::cout << std::endl << "Test OK!" << std::endl; return true; } +bool test_ctad() //Older clang versions suffer from ICE here +#if !defined(BOOST_CONTAINER_NO_CXX17_CTAD) && (!defined(BOOST_CLANG) || (BOOST_CLANG_VERSION >= 80000)) +{ + typedef std::vector MyStd; + //Check Constructor Template Auto Deduction + { + MyStd gold = MyStd{ 1, 2, 3 }; + segmented_vector test = segmented_vector(gold.begin(), gold.end()); + if (!test::CheckEqualContainers(gold, test)) return false; + } + { + MyStd gold = MyStd{ 1, 2, 3 }; + segmented_vector test = segmented_vector(gold.begin(), gold.end(), new_allocator()); + if (!test::CheckEqualContainers(gold, test)) return false; + } + return true; +} +#else +{ return true; } +#endif + template struct GetAllocatorCont { @@ -426,6 +433,9 @@ int main () if(!do_test_default_block_size()) return 1; + if (!test_ctad()) + return 1; + //Test non-copy-move operations (back only; no emplace_front) { segmented_vector d;