diff --git a/CMakeLists.txt b/CMakeLists.txt index 13887a6..fb3d38a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,14 @@ macro(warnings_high) add_compile_options(-Wsign-conversion) endif () add_compile_options(-Wall -Wextra -Werror -Wundef) + # There are a few places with subtle reasons for array access being correct + # GCC's warnings are too aggressive and incorrectly assume the code is wrong. + # Disabling only in Release is so the ASSUME can be mapped to assert and check + # at runtime in debug. This ensures we are covering the cases of concern with + # debug checks, but not incurring runtime penalties in release. + if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_BUILD_TYPE STREQUAL "Release")) + add_compile_options(-Wno-array-bounds) + endif () endif() endmacro() diff --git a/src/ds/defines.h b/src/ds/defines.h index f697e1f..f22dd64 100644 --- a/src/ds/defines.h +++ b/src/ds/defines.h @@ -62,6 +62,12 @@ namespace snmalloc #else # if __has_builtin(__builtin_assume) # define SNMALLOC_ASSUME(x) __builtin_assume((x)) +# elif defined(_MSC_VER) +# define SNMALLOC_ASSUME(x) __assume((x)); +# elif defined(__GNUC__) +# define SNMALLOC_ASSUME(x) \ + if (!(x)) \ + __builtin_unreachable(); # else # define SNMALLOC_ASSUME(x) \ do \