Fix -Werror=implicit-fallthrough (fixes gcc-7)

https://github.com/libevent/libevent/commit/94e7dcebc320
https://github.com/libevent/libevent/commit/ffbce578c40a

--- bufferevent_filter.c.orig	2017-01-25 23:37:15 UTC
+++ bufferevent_filter.c
@@ -612,9 +612,12 @@ be_filter_ctrl(struct bufferevent *bev, 
 			bevf->underlying->be_ops->ctrl) {
 		    return (bevf->underlying->be_ops->ctrl)(bevf->underlying, op, data);
 		}
+		EVUTIL_FALLTHROUGH;
 
 	case BEV_CTRL_GET_FD:
+		EVUTIL_FALLTHROUGH;
 	case BEV_CTRL_CANCEL_ALL:
+		EVUTIL_FALLTHROUGH;
 	default:
 		return -1;
 	}
--- evdns.c.orig	2017-01-25 23:37:15 UTC
+++ evdns.c
@@ -2265,10 +2265,11 @@ evdns_request_transmit(struct request *r
 		nameserver_write_waiting(req->ns, 1);
 		return 1;
 	case 2:
-		/* failed to transmit the request entirely. */
+		/* failed to transmit the request entirely. we can fallthrough since
+		 * we'll set a timeout, which will time out, and make us retransmit the
+		 * request anyway. */
 		retcode = 1;
-		/* fall through: we'll set a timeout, which will time out,
-		 * and make us retransmit the request anyway. */
+		EVUTIL_FALLTHROUGH;
 	default:
 		/* all ok */
 		log(EVDNS_LOG_DEBUG,
--- event.c.orig	2017-01-25 23:37:15 UTC
+++ event.c
@@ -2960,6 +2960,7 @@ event_callback_activate_nolock_(struct e
 	switch (evcb->evcb_flags & (EVLIST_ACTIVE|EVLIST_ACTIVE_LATER)) {
 	default:
 		EVUTIL_ASSERT(0);
+		EVUTIL_FALLTHROUGH;
 	case EVLIST_ACTIVE_LATER:
 		event_queue_remove_active_later(base, evcb);
 		r = 0;
--- util-internal.h.orig	2017-01-25 23:37:15 UTC
+++ util-internal.h
@@ -50,6 +50,20 @@
 extern "C" {
 #endif
 
+/* __has_attribute() wrapper */
+#ifdef __has_attribute
+#define EVUTIL_HAS_ATTRIBUTE __has_attribute
+#endif
+/** clang 3 __has_attribute misbehaves in some versions */
+#if defined(__clang__) && \
+	__clang__ == 1 && __clang_major__ == 3 && \
+	(__clang_minor__ >= 2 && __clang_minor__ <= 5)
+#undef EVUTIL_HAS_ATTRIBUTE
+#endif
+#ifndef EVUTIL_HAS_ATTRIBUTE
+#define EVUTIL_HAS_ATTRIBUTE(x) 0
+#endif
+
 /* If we need magic to say "inline", get it for free internally. */
 #ifdef EVENT__inline
 #define inline EVENT__inline
@@ -308,6 +322,12 @@ ev_int32_t evutil_weakrand_range_(struct
 #define EVUTIL_UNLIKELY(p) (p)
 #endif
 
+#if EVUTIL_HAS_ATTRIBUTE(fallthrough)
+#define EVUTIL_FALLTHROUGH __attribute__((fallthrough))
+#else
+#define EVUTIL_FALLTHROUGH /* fallthrough */
+#endif
+
 /* Replacement for assert() that calls event_errx on failure. */
 #ifdef NDEBUG
 #define EVUTIL_ASSERT(cond) EVUTIL_NIL_CONDITION_(cond)
