X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FCppAttributes.h;h=2ebbae8cff35a164d3f778da3db64da12c91ead9;hb=3d9eb7ffc32c2f5f878bb4aee61d30cb8c62a146;hp=6f75b8ac4e062cf6ea2d73dcb34fcd74e6c91503;hpb=396329db16b56fd9d3aa9858092b3a3af8f2ea89;p=folly.git diff --git a/folly/CppAttributes.h b/folly/CppAttributes.h index 6f75b8ac..2ebbae8c 100644 --- a/folly/CppAttributes.h +++ b/folly/CppAttributes.h @@ -1,5 +1,5 @@ /* - * 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. @@ -20,8 +20,13 @@ * @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 @@ -48,12 +53,36 @@ * 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 +/** + * 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. @@ -73,8 +102,20 @@ */ #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_ */ +/** + * "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