Assorted tweaks to folly/String.h
[folly.git] / folly / CppAttributes.h
index f1ed1c23bcf9b9c7beb057e633df82c395090a39..2ebbae8cff35a164d3f778da3db64da12c91ead9 100644 (file)
 
 #pragma once
 
+#ifndef __has_attribute
+#define FOLLY_HAS_ATTRIBUTE(x) 0
+#else
+#define FOLLY_HAS_ATTRIBUTE(x) __has_attribute(x)
+#endif
+
 #ifndef __has_cpp_attribute
 #define FOLLY_HAS_CPP_ATTRIBUTE(x) 0
 #else
  *     FOLLY_FALLTHROUGH; // no warning: annotated fall-through
  * }
  */
-#if FOLLY_HAS_CPP_ATTRIBUTE(clang::fallthrough)
+#if FOLLY_HAS_CPP_ATTRIBUTE(fallthrough)
+#define FOLLY_FALLTHROUGH [[fallthrough]]
+#elif FOLLY_HAS_CPP_ATTRIBUTE(clang::fallthrough)
 #define FOLLY_FALLTHROUGH [[clang::fallthrough]]
+#elif FOLLY_HAS_CPP_ATTRIBUTE(gnu::fallthrough)
+#define FOLLY_FALLTHROUGH [[gnu::fallthrough]]
 #else
 #define FOLLY_FALLTHROUGH
 #endif
@@ -65,7 +75,9 @@
  *    #endif
  *  }
  */
-#if FOLLY_HAS_CPP_ATTRIBUTE(__unused__)
+#if FOLLY_HAS_CPP_ATTRIBUTE(maybe_unused)
+#define FOLLY_MAYBE_UNUSED [[maybe_unused]]
+#elif FOLLY_HAS_ATTRIBUTE(__unused__) || __GNUC__
 #define FOLLY_MAYBE_UNUSED __attribute__((__unused__))
 #else
 #define FOLLY_MAYBE_UNUSED
  */
 #if FOLLY_HAS_EXTENSION(nullability)
 #define FOLLY_NULLABLE _Nullable
+#define FOLLY_NONNULL _Nonnull
 #else
 #define FOLLY_NULLABLE
+#define FOLLY_NONNULL
+#endif
+
+/**
+ * "Cold" indicates to the compiler that a function is only expected to be
+ * called from unlikely code paths. It can affect decisions made by the
+ * optimizer both when processing the function body and when analyzing
+ * call-sites.
+ */
+#if __GNUC__
+#define FOLLY_COLD __attribute__((__cold__))
+#else
+#define FOLLY_COLD
 #endif