Added ETL_DISABLE_BUILTIN_FUNCTIONS to allow tests to to be run without using builtins

This commit is contained in:
John Wellbelove 2026-10-09 10:41:48 +01:00
parent c6b8c99f8e
commit 14aae8c717
10 changed files with 69 additions and 30 deletions

View File

@ -881,7 +881,6 @@ namespace etl
{
public:
ETL_STATIC_ASSERT((etl::is_trivially_copyable<T>::value), "atomic<T> requires that T is trivially copyable");
ETL_STATIC_ASSERT((etl::is_copy_constructible<T>::value), "atomic<T> requires that T is copy constructible");
ETL_STATIC_ASSERT((etl::is_copy_assignable<T>::value), "atomic<T> requires that T is copy assignable");
ETL_STATIC_ASSERT((etl::is_move_constructible<T>::value), "atomic<T> requires that T is move constructible");
@ -963,14 +962,15 @@ namespace etl
(void)order;
ETL_BUILTIN_LOCK;
if (memcmp(&value, &expected, sizeof(T)) == 0)
if (value == expected)
{
value = desired;
result = true;
}
else
{
result = false;
expected = value;
result = false;
}
ETL_BUILTIN_UNLOCK;
@ -2062,7 +2062,6 @@ namespace etl
{
public:
ETL_STATIC_ASSERT((etl::is_trivially_copyable<T>::value), "atomic<T> requires that T is trivially copyable");
ETL_STATIC_ASSERT((etl::is_copy_constructible<T>::value), "atomic<T> requires that T is copy constructible");
ETL_STATIC_ASSERT((etl::is_copy_assignable<T>::value), "atomic<T> requires that T is copy assignable");
ETL_STATIC_ASSERT((etl::is_move_constructible<T>::value), "atomic<T> requires that T is move constructible");
@ -2139,15 +2138,17 @@ namespace etl
{
bool result;
(void)order;
ETL_BUILTIN_LOCK;
if (memcmp(&value, &expected, sizeof(T)) == 0)
if (value == expected)
{
value = desired;
result = true;
}
else
{
result = false;
expected = value;
result = false;
}
ETL_BUILTIN_UNLOCK;

View File

@ -46,9 +46,9 @@ SOFTWARE.
#endif
#endif
#if defined(__has_builtin) && !defined(ETL_COMPILER_MICROSOFT) // Use __has_builtin to check for
// existence of builtin functions?
// Fix VS2022 intellisense issue.
#if defined(__has_builtin) && !defined(ETL_DISABLE_BUILTIN_FUNCTIONS) && !defined(ETL_COMPILER_MICROSOFT) // Use __has_builtin to check for
// existence of builtin functions?
// Fix VS2022 intellisense issue.
#if !defined(ETL_USING_BUILTIN_IS_ASSIGNABLE)
#define ETL_USING_BUILTIN_IS_ASSIGNABLE __has_builtin(__is_assignable)
#endif

View File

@ -4946,7 +4946,7 @@ namespace etl
{
return false;
}
#elif ETL_USING_BUILTIN_IS_CONSTANT_EVALUATED == 1
#elif ETL_USING_BUILTIN_IS_CONSTANT_EVALUATED
// Fallback for C++20 on supported compilers
return __builtin_is_constant_evaluated();
#else

View File

@ -447,6 +447,11 @@ if (ETL_USER_DEFINED_TYPE_TRAITS)
target_compile_definitions(etl_tests PRIVATE -DETL_USER_DEFINED_TYPE_TRAITS)
endif()
if (ETL_DISABLE_BUILTIN_FUNCTIONS)
message(STATUS "Compiling with builtin functions disabled")
target_compile_definitions(etl_tests PRIVATE -DETL_DISABLE_BUILTIN_FUNCTIONS)
endif()
if (ETL_MESSAGES_ARE_NOT_VIRTUAL)
message(STATUS "Compiling for non-virtual messages")
target_compile_definitions(etl_tests PRIVATE -DETL_MESSAGES_ARE_NOT_VIRTUAL)

View File

@ -59,8 +59,7 @@ for CXXSTD in 11 14 17 20 23 26; do
-DETL_OPTIMISATION=-O0 \
-DETL_CXX_STANDARD=$CXXSTD \
-DETL_ENABLE_SANITIZER=OFF \
-DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF \
-DETL_USE_BUILTIN_MEM_FUNCTIONS=ON ..
-DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF ..
cmake --build .
./etl_tests
lcov --gcov-tool "$GCOV" $GCOV_ADD --capture --directory CMakeFiles/etl_tests.dir \

View File

@ -148,7 +148,8 @@ RunCheck()
local msg=$2
local no_stl=$3
local force_03=$4
local build_dir=$5
local disable_builtins=$5
local build_dir=$6
if [ "$compiler_enabled" != "$cc_name" ] && [ "$compiler_enabled" != "All compilers" ]; then
return
@ -169,7 +170,7 @@ RunCheck()
rm -rdf bgcc
rm -rdf bclang
cmake -E make_directory bgcc bclang
CC=$cc CXX=$cxx cmake -E chdir $build_dir cmake -DNO_STL=$no_stl -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=$force_03 -DETL_CXX_STANDARD=$cxx_standard ..
CC=$cc CXX=$cxx cmake -E chdir $build_dir cmake -DNO_STL=$no_stl -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=$force_03 -DETL_DISABLE_BUILTIN_FUNCTIONS=$disable_builtins -DETL_CXX_STANDARD=$cxx_standard ..
cmake --build $build_dir
if [ $? -eq 0 ]; then
PassedCompilation
@ -191,21 +192,27 @@ RunStandard()
cxx_standard=$std
# GCC configurations
RunCheck gcc "STL" OFF OFF bgcc
RunCheck gcc "No STL" ON OFF bgcc
RunCheck gcc "STL" OFF OFF OFF bgcc
RunCheck gcc "No STL" ON OFF OFF bgcc
RunCheck gcc "STL - Disable builtins" OFF ON ON bgcc
RunCheck gcc "No STL - Disable builtins" ON ON ON bgcc
if [ "$has_force_03" = "1" ]; then
RunCheck gcc "STL - Force C++03" OFF ON bgcc
RunCheck gcc "No STL - Force C++03" ON ON bgcc
RunCheck gcc "STL - Force C++03" OFF ON OFF bgcc
RunCheck gcc "No STL - Force C++03" ON ON OFF bgcc
fi
# Clang configurations
RunCheck clang "STL" OFF OFF bclang
RunCheck clang "No STL" ON OFF bclang
RunCheck clang "STL" OFF OFF OFF bclang
RunCheck clang "No STL" ON OFF OFF bclang
RunCheck clang "STL - Disable builtins" OFF ON ON bclang
RunCheck clang "No STL - Disable builtins" ON ON ON bclang
if [ "$has_force_03" = "1" ]; then
RunCheck clang "STL - Force C++03" OFF ON bclang
RunCheck clang "No STL - Force C++03" ON ON bclang
RunCheck clang "STL - Force C++03" OFF ON OFF bclang
RunCheck clang "No STL - Force C++03" ON ON OFF bclang
fi
}

View File

@ -17,7 +17,7 @@ TitleColour='\033[38;2;107;210;255m'
HelpColour='\033[38;2;250;180;250m'
NoColour='\033[0m'
ParseGitBranch()
ParseGitBranch()
{
git rev-parse --abbrev-ref HEAD
}
@ -145,7 +145,7 @@ elif [ "$2" = "1" ]; then
elif [ "$2" = "2" ]; then
opt="-O2"
elif [ "$2" = "3" ]; then
opt="-O3"
opt="-O3"
else
opt="-O0"
fi
@ -245,12 +245,12 @@ gcc ,STL - Non-virtual messages,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMP
gcc ,STL - Force C++03 ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
gcc ,No STL ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
gcc ,No STL - Force C++03 ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
gcc ,No STL - Builtin mem functions ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON $verbose_cmake_flag ..
gcc ,No STL - Disable builtins ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_DISABLE_BUILTIN_FUNCTIONS=ON $verbose_cmake_flag ..
clang,STL ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
clang,STL - Force C++03 ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
clang,No STL ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
clang,No STL - Force C++03 ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF $verbose_cmake_flag ..
clang,No STL - Builtin mem functions ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON $verbose_cmake_flag ..
clang,No STL - Disable builtins ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=ON -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_DISABLE_BUILTIN_FUNCTIONS=ON $verbose_cmake_flag ..
gcc ,Initializer list test ,etl_initializer_list,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize $verbose_cmake_flag ..
clang,Initializer list test ,etl_initializer_list,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize $verbose_cmake_flag ..
gcc ,Error macros 'log_errors' test,etl_error_handler/log_errors ,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize $verbose_cmake_flag ..

View File

@ -17,6 +17,11 @@ if (ETL_USER_DEFINED_TYPE_TRAITS)
add_definitions(-DETL_USER_DEFINED_TYPE_TRAITS)
endif()
if (ETL_DISABLE_BUILTIN_FUNCTIONS)
message(STATUS "Compiling with builtin functions disabled")
add_definitions(-DETL_DISABLE_BUILTIN_FUNCTIONS)
endif()
if (ETL_FORCE_TEST_CPP03_IMPLEMENTATION)
message(STATUS "Force C++03 implementations")
add_definitions(-DETL_FORCE_TEST_CPP03_IMPLEMENTATION)

View File

@ -1943,6 +1943,7 @@ namespace
}
//*************************************************************************
#if (ETL_USING_STL && ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED) || ETL_USING_BUILTIN_IS_TRIVIALLY_COPYABLE
TEST(test_start_lifetime_as)
{
struct quad_t
@ -1968,6 +1969,7 @@ namespace
CHECK_EQUAL(1, cp->a);
CHECK_EQUAL(4, cp->d);
}
#endif
//*************************************************************************
TEST(test_start_lifetime_as_array)

View File

@ -792,6 +792,7 @@ namespace
}
//*************************************************************************
#if ETL_USING_CPP17 && ETL_USING_STL || ETL_USING_BUILTIN_IS_STANDARD_LAYOUT
TEST(test_is_standard_layout)
{
struct StandardLayout
@ -818,8 +819,10 @@ namespace
CHECK(!etl::is_standard_layout_v<NonStandardLayout>);
#endif
}
#endif
//*************************************************************************
#if (ETL_USING_CPP17 && ETL_USING_STL) || ETL_USING_BUILTIN_IS_TRIVIAL
TEST(test_is_trivial)
{
struct Trivial
@ -869,6 +872,7 @@ namespace
CHECK(!etl::is_trivial_v<NonTrivialConstructor>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_BUILTIN_IS_LAYOUT_COMPATIBLE || (ETL_USING_STL && ETL_USING_CPP20 && defined(__cpp_lib_is_layout_compatible))
@ -1265,6 +1269,7 @@ namespace
#endif
//*************************************************************************
#if ETL_USING_STL || ETL_USING_BUILTIN_IS_UNION
TEST(test_is_union)
{
union Union
@ -1292,8 +1297,10 @@ namespace
CHECK(!etl::is_union_v<NonUnion>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_STL || ETL_USING_BUILTIN_IS_EMPTY
TEST(test_is_empty)
{
struct Empty
@ -1332,8 +1339,10 @@ namespace
CHECK(!etl::is_empty_v<NotEmpty>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_STL || ETL_USING_BUILTIN_IS_POLYMORPHIC
TEST(test_is_polymorphic)
{
struct NonPolymorphic
@ -1373,8 +1382,10 @@ namespace
CHECK(!etl::is_polymorphic_v<NonPolymorphic>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_STL || ETL_USING_BUILTIN_IS_ABSTRACT
TEST(test_is_abstract)
{
struct NonAbstract
@ -1422,9 +1433,10 @@ namespace
CHECK(!etl::is_abstract_v<ConcreteDerived>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_CPP14
#if ETL_USING_CPP14 && (ETL_USING_STL || ETL_USING_BUILTIN_IS_FINAL)
TEST(test_is_final)
{
struct NonFinal
@ -1481,7 +1493,7 @@ namespace
#endif
//*************************************************************************
#if ETL_USING_CPP17
#if ETL_USING_CPP17 && (ETL_USING_STL || ETL_USING_BUILTIN_IS_AGGREGATE)
TEST(test_is_aggregate)
{
struct Aggregate
@ -1542,6 +1554,7 @@ namespace
#endif
//*************************************************************************
#if ETL_USING_STL || ETL_USING_BUILTIN_HAS_VIRTUAL_DESTRUCTOR
TEST(test_has_virtual_destructor)
{
struct NonVirtualDestructor
@ -1588,9 +1601,10 @@ namespace
CHECK(!etl::has_virtual_destructor_v<NonVirtualDestructor>);
#endif
}
#endif
//*************************************************************************
#if ETL_USING_CPP17
#if ETL_USING_CPP17 && (ETL_USING_STL || ETL_USING_BUILTIN_HAS_UNIQUE_OBJECT_REPRESENTATIONS)
TEST(test_has_unique_object_representations)
{
struct NoPadding
@ -2969,6 +2983,10 @@ namespace
}
//*************************************************************************
#if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED || ETL_USING_BUILTIN_IS_TRIVIALLY_ASSIGNABLE
template <typename T1, typename T2>
using is_trivially_assignable = std::is_trivially_assignable<T1, T2>;
#elif ETL_USING_BUILTIN_IS_TRIVIALLY_ASSIGNABLE
TEST(test_is_trivially_assignable)
{
#if ETL_USING_CPP11 && !defined(ETL_USER_DEFINED_TYPE_TRAITS) \
@ -2986,6 +3004,7 @@ namespace
#endif
#endif
}
#endif
//*************************************************************************
TEST(test_is_trivially_copy_assignable)
@ -3343,11 +3362,12 @@ namespace
TEST(test_is_constant_evaluated)
{
constexpr bool c0 = etl::is_constant_evaluated();
#if !ETL_USING_CPP23 && defined(ETL_COMPILER_MICROSOFT)
#if (!ETL_USING_CPP23 && (defined(ETL_COMPILER_MICROSOFT) || !ETL_USING_BUILTIN_IS_CONSTANT_EVALUATED))
// Not supported on MSVC via __has_builtin, see
// determine_builtin_support.h
CHECK_FALSE(c0);
#else
CHECK_TRUE(c0);
#endif