aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt10
-rw-r--r--src/nvim/assert.h9
2 files changed, 15 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7e73443ec2..8272a1a469 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -248,6 +248,16 @@ int main(void)
}
" HAVE_EXECINFO_BACKTRACE)
+check_c_source_compiles("
+int main(void)
+{
+ int a;
+ __builtin_add_overflow(a, a, &a);
+ __builtin_sub_overflow(a, a, &a);
+ return 0;
+}
+" HAVE_BUILTIN_ADD_OVERFLOW)
+
if(MSVC)
# XXX: /W4 gives too many warnings. #3241
add_definitions(/W3 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
diff --git a/src/nvim/assert.h b/src/nvim/assert.h
index 3f985475a7..29195a49dc 100644
--- a/src/nvim/assert.h
+++ b/src/nvim/assert.h
@@ -122,6 +122,7 @@
#endif
/// @def STRICT_ADD
+/// @brief Adds (a + b) and stores result in `c`. Aborts on overflow.
///
/// Requires GCC 5+ and Clang 3.8+
/// https://clang.llvm.org/docs/LanguageExtensions.html
@@ -132,8 +133,7 @@
///
/// @param MAX Maximum value of the narrowest type of operand.
/// Not used if compiler supports __builtin_add_overflow.
-#if (defined(__clang__) && __has_builtin(__builtin_add_overflow)) \
- || (__GNUC__ >= 5)
+#if HAVE_BUILTIN_ADD_OVERFLOW
# define STRICT_ADD(a, b, c, t) \
do { if (__builtin_add_overflow(a, b, c)) { abort(); } } while (0)
#else
@@ -141,8 +141,9 @@
do { *(c) = (t)(a + b); } while (0)
#endif
-#if (defined(__clang__) && __has_builtin(__builtin_sub_overflow)) \
- || (__GNUC__ >= 5)
+/// @def STRICT_SUB
+/// @brief Subtracts (a - b) and stores result in `c`. Aborts on overflow.
+#if HAVE_BUILTIN_ADD_OVERFLOW
# define STRICT_SUB(a, b, c, t) \
do { if (__builtin_sub_overflow(a, b, c)) { abort(); } } while (0)
#else