From 396329db16b56fd9d3aa9858092b3a3af8f2ea89 Mon Sep 17 00:00:00 2001 From: Dominik Gabi Date: Wed, 23 Dec 2015 15:43:26 -0800 Subject: [PATCH] wrapper for nullable attribute Reviewed By: yfeldblum Differential Revision: D2784472 fb-gh-sync-id: 84c7426cc82edabb04c662fa699764ffc0864b7e --- folly/CppAttributes.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/folly/CppAttributes.h b/folly/CppAttributes.h index 4a001946..6f75b8ac 100644 --- a/folly/CppAttributes.h +++ b/folly/CppAttributes.h @@ -29,6 +29,12 @@ #define FOLLY_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) #endif +#ifndef __has_extension +#define FOLLY_HAS_EXTENSION(x) 0 +#else +#define FOLLY_HAS_EXTENSION(x) __has_extension(x) +#endif + /** * Fallthrough to indicate that `break` was left out on purpose in a switch * statement, e.g. @@ -48,4 +54,27 @@ #define FOLLY_FALLTHROUGH #endif +/** + * Nullable indicates that a return value or a parameter may be a `nullptr`, + * e.g. + * + * int* FOLLY_NULLABLE foo(int* a, int* FOLLY_NULLABLE b) { + * if (*a > 0) { // safe dereference + * return nullptr; + * } + * if (*b < 0) { // unsafe dereference + * return *a; + * } + * if (b != nullptr && *b == 1) { // safe checked dereference + * return new int(1); + * } + * return nullptr; + * } + */ +#if FOLLY_HAS_EXTENSION(nullability) +#define FOLLY_NULLABLE _Nullable +#else +#define FOLLY_NULLABLE +#endif + #endif /* FOLLY_BASE_ATTRIBUTES_H_ */ -- 2.34.1