]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add a fallthrough macro.
authorNick Mathewson <nickm@torproject.org>
Wed, 6 May 2020 14:24:21 +0000 (10:24 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 6 May 2020 19:08:02 +0000 (15:08 -0400)
This macro defers to __attribute__((fallthrough)) on GCC (and
clang).  Previously we had been using GCC's magic /* fallthrough */
comments, but clang very sensibly doesn't accept those.

Since not all compiler recognize it, we only define it when our
configure script detects that it works.

Part of a fix for 34078.

configure.ac
src/lib/cc/compat_compiler.h

index bc434ed83667283217f1285f62a1703d0f040c4c..a441162f4c3d87a1bc46a518fd355f48cdbac9a9 100644 (file)
@@ -356,6 +356,22 @@ if test "$tor_cv_c_c99_designated_init" != "yes"; then
   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
 fi
 
+saved_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Werror"
+AC_CACHE_CHECK([for __attribute__((fallthrough))],
+      tor_cv_c_attr_fallthrough,
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([extern int x; void fn(void) ;],
+              [[ switch (x) { case 1: fn(); __attribute__((fallthrough));
+                               case 2: fn(); break; } ]])],
+        [tor_cv_c_attr_fallthrough=yes],
+        [tor_cv_c_attr_fallthrough=no] )])
+CFLAGS="$saved_CFLAGS"
+
+if test "$tor_cv_c_attr_fallthrough" == "yes"; then
+  AC_DEFINE(HAVE_ATTR_FALLTHROUGH, [1], [defined if we have the fallthrough attribute.])
+fi
+
 TORUSER=_tor
 AC_ARG_WITH(tor-user,
         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
index 3a0f307186416e1bb5ddaf7b747db35de9356ee7..fbe6a38f1f719740186c8b7627961fb322f94e64 100644 (file)
 #define CHECK_SCANF(formatIdx, firstArg)
 #endif /* defined(__GNUC__) */
 
+#if defined(HAVE_ATTR_FALLTHROUGH)
+#define FALLTHROUGH __attribute__((fallthrough))
+#else
+#define FALLTHROUGH
+#endif
+
 /* What GCC do we have? */
 #ifdef __GNUC__
 #define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)