summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-08-25 17:56:57 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2020-08-25 17:57:38 -0700
commitd4b5dff48297faec67291c95f8831a3d84f87460 (patch)
tree98caae86121f8d4bceb3fa462ac1e352468863a0 /lib
parent65543b5a879315031d275c7a9a9eb2e26452eb10 (diff)
downloademacs-d4b5dff48297faec67291c95f8831a3d84f87460.tar.gz
Update from Gnulib
This incorporates: 2020-08-25 verify: Avoid warnings when assume(0) is used * lib/verify.h: Copy from Gnulib.
Diffstat (limited to 'lib')
-rw-r--r--lib/verify.h16
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/verify.h b/lib/verify.h
index 6d7b961db71..ca2a1540736 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -320,7 +320,9 @@ template <int w>
based on __builtin_unreachable does not. (GCC so far has only
__builtin_unreachable.) */
#if _GL_HAS_BUILTIN_ASSUME
-/* Use a temporary variable, to avoid a clang warning
+/* Use __builtin_constant_p to help clang's data-flow analysis for the case
+ assume (0).
+ Use a temporary variable, to avoid a clang warning
"the argument to '__builtin_assume' has side effects that will be discarded"
if R contains invocations of functions not marked as 'const'.
The type of the temporary variable can't be __typeof__ (R), because that
@@ -328,12 +330,16 @@ template <int w>
instead. */
# if defined __cplusplus
# define assume(R) \
- ((void) ({ bool _gl_verify_temp = (R); \
- __builtin_assume (_gl_verify_temp); }))
+ (__builtin_constant_p (R) && !(R) \
+ ? (void) __builtin_unreachable () \
+ : (void) ({ bool _gl_verify_temp = (R); \
+ __builtin_assume (_gl_verify_temp); }))
# else
# define assume(R) \
- ((void) ({ _Bool _gl_verify_temp = (R); \
- __builtin_assume (_gl_verify_temp); }))
+ (__builtin_constant_p (R) && !(R) \
+ ? (void) __builtin_unreachable () \
+ : (void) ({ _Bool _gl_verify_temp = (R); \
+ __builtin_assume (_gl_verify_temp); }))
# endif
#elif _GL_HAS_BUILTIN_UNREACHABLE
# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())