]> granicus.if.org Git - strace/commitdiff
Introduce static_assert
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 3 Apr 2018 22:52:54 +0000 (22:52 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Apr 2018 12:24:19 +0000 (12:24 +0000)
We are going to use static_assert provided by <assert.h> or,
if it doesn't work, our cheap imitation that doesn't display
the message specified as the second argument of static_assert.

* configure.ac (AC_CACHE_CHECK): Check for static_assert in <assert.h>,
define HAVE_STATIC_ASSERT if it is available.
* static_assert.h: New file.
* Makefile.am (strace_SOURCES): Add it.

Makefile.am
configure.ac
static_assert.h [new file with mode: 0755]

index b961a6dd34e3fac6ba4b7e8cb232c25175d6d80b..354da2a314ceedb753b40377b0229cfccbf560f7 100644 (file)
@@ -303,6 +303,7 @@ strace_SOURCES =    \
        stat64.c        \
        statfs.c        \
        statfs.h        \
+       static_assert.h \
        statx.c         \
        statx.h         \
        strace.c        \
index 4b8bc7363969622b135f48232c896787489ff967..89f3f559e255b7fd47b3ed6136f5d2c5232fe781 100644 (file)
@@ -803,6 +803,16 @@ if test "x$st_cv_have_program_invocation_name" = xyes; then
                  [Define to 1 if the system provides program_invocation_name variable])
 fi
 
+AC_CACHE_CHECK([for static_assert], [st_cv_have_static_assert],
+              [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <assert.h>]],
+                                               [[static_assert(1,"")]])],
+                              [st_cv_have_static_assert=yes],
+                              [st_cv_have_static_assert=no])])
+if test "x$st_cv_have_static_assert" = xyes; then
+       AC_DEFINE([HAVE_STATIC_ASSERT], [1],
+                 [Define to 1 if the system provides static_assert])
+fi
+
 AC_CHECK_LIB([dl], [dladdr], [dl_LIBS='-ldl'], [dl_LIBS=])
 if test "x$ac_cv_lib_dl_dladdr" = xyes; then
        AC_DEFINE([HAVE_DLADDR], [1], [Define to 1 if the system provides dladdr])
diff --git a/static_assert.h b/static_assert.h
new file mode 100755 (executable)
index 0000000..1c58e7d
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef STRACE_STATIC_ASSERT_H
+#define STRACE_STATIC_ASSERT_H
+
+#include "assert.h"
+
+#ifndef HAVE_STATIC_ASSERT
+
+# define static_assert(expr, message) \
+       extern int (*strace_static_assert(int))[sizeof(int[2 * !!(expr) - 1])]
+
+#endif
+
+#endif /* !STRACE_STATIC_ASSERT_H */