/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* @author Dominik Gabi
*/
-#ifndef FOLLY_BASE_ATTRIBUTES_H_
-#define FOLLY_BASE_ATTRIBUTES_H_
+#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
#define FOLLY_FALLTHROUGH
#endif
+/**
+ * Maybe_unused indicates that a function, variable or parameter might or
+ * might not be used, e.g.
+ *
+ * int foo(FOLLY_MAYBE_UNUSED int x) {
+ * #ifdef USE_X
+ * return x;
+ * #else
+ * return 0;
+ * #endif
+ * }
+ */
+#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
+#endif
+
/**
* Nullable indicates that a return value or a parameter may be a `nullptr`,
* e.g.
*/
#if FOLLY_HAS_EXTENSION(nullability)
#define FOLLY_NULLABLE _Nullable
+#define FOLLY_NONNULL _Nonnull
#else
#define FOLLY_NULLABLE
+#define FOLLY_NONNULL
#endif
-
-#endif /* FOLLY_BASE_ATTRIBUTES_H_ */