From: Dominik Gabi Date: Wed, 23 Dec 2015 23:43:26 +0000 (-0800) Subject: wrapper for nullable attribute X-Git-Tag: deprecate-dynamic-initializer~173 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=396329db16b56fd9d3aa9858092b3a3af8f2ea89;p=folly.git wrapper for nullable attribute Reviewed By: yfeldblum Differential Revision: D2784472 fb-gh-sync-id: 84c7426cc82edabb04c662fa699764ffc0864b7e --- 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_ */